2017-05-18 17 views
0

これで、結合を試して、これを達成するための最良の方法を見つけようとしています。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を注文しています注意してください。

+2

Iドンそれを手に入れません。 Aのサンプルデータ、Bのサンプルデータ、入手した結果、期待する結果を表示してください。 –

+0

@ThorstenKettner質問を更新しました。 –

答えて

1

これは非常に奇妙なクエリの結果です。結局のところ、それは組み合わせの2つのクエリです:

  • を取得
  • が参加したデータ

クエリが故に、ユニオンクエリであると、すべてのBのレコードを取得するすべてのレコード:

selectid b.id, b.post_id, b.member_id, a.data, b.post_date, a.updated 
from b 
join a on a.id = b.post_id 
union all 
select id a.id, null, a.member_id, a.data, null, a.updated 
from a 
order by greatest(updated, coalesce(post_date, updated)) desc; 
+0

これは私がユニオンを使用するのに必要な方向性を与えました。これと別のポストは私が解決策を考え出すのを助けました。ありがとう –

関連する問題