これで、結合を試して、これを達成するための最良の方法を見つけようとしています。PostgreSQL - 結合テーブルのすべての行を含める
私はこれらのテーブルを持っているとしましょう。簡潔にするためにすべての列を入れない。しかし、表Aには、表B.post_id
は、私は、テーブルAとBを結合するが、すべて返すようにしたいTable A.id
への外部キーであるB.
Table A
---------
| id | member_id | data | updated
よりもさらにいくつかの列次に、この表
Table B
---------
| id | post_id | member_id | post_date
を持っています行。今はテーブルAからすべての行を返し、テーブルbからは一致した行だけを返すことができます。私は、テーブルAと2つの時間列の中で最大のORDER BY DESCからマッチした行テーブルBが必要です。ここで
は私が望む結果を得ることはありません
SELECT a.*, b.member_id as poster, b.post_date, c.title, c.level
FROM tableA as a LEFT JOIN tableC as c ON c.a_id=a.a_id
LEFT JOIN tableB as b ON a.id=b.post_id
WHERE a.member_id IN (100,101) OR b.member_id IN (100,101)
ORDER BY GREATEST(a.updated,b.post_date) DESC LIMIT 10
でプレーしてきたクエリです。テーブルAからのID 20の行がテーブルbと一致する場合、結果のテーブルbの行と両方のテーブルの両方の行の代わりにテーブルbの行が取得されます。私は多くの方法で試してきたし、他の答えを試してみた。クエリは多くのレコードでうまく機能するはずです。誰かがこれを行うためのより優れたパフォーマンス方法を持っていて、それを共有してください。ここで
はサンプルデータです:
表A
id | member_id | data | updated
--- ------- --------- ---------
10 | 101 | data | 1495081193
11 | 100 | data | 1495081500
12 | 101 | data | 1495081600
表B
id post_id | member_id | post_date
--- ------- --------- ---------
2 | 10 | 101 | 1495083000
3 | 10 | 100 | 1495083500
それでは、私は結果を期待していが参加する上では、
id post_id | member_id | data | post_date | updated
--- ------- --------- ------ --------- -------
3 | 10 | 100 | data | 1495083500 | 1495081193
2 | 10 | 101 | data | 1495083000 | 1495081193
12 | | 101 | data | | 1495081600
11 | | 100 | data | | 1495081500
10 | | 101 | data | | 1495081193
です
しかし、私は唯一の一致した列が最後のものではありません。 ラフ例です
id post_id | member_id | data | post_date | updated
--- ------- --------- ------ --------- -------
3 | 10 | 100 | data | 1495083500 | 1495081193
2 | 10 | 101 | data | 1495083000 | 1495081193
12 | | 101 | data | | 1495081600
11 | | 100 | data | | 1495081500
は、私はどちらかの列のタイムスタンプを使用することにより、GREATESTを注文しています注意してください。
Iドンそれを手に入れません。 Aのサンプルデータ、Bのサンプルデータ、入手した結果、期待する結果を表示してください。 –
@ThorstenKettner質問を更新しました。 –