2

私は2つのテーブルを持っています:

  • 表 1 - ID、created_at
  • Table2、Id、table1_id、created_at

最新の Table2 レコード (ある場合、table2 レコードがない可能性があります) をフェッチする結合を使用してすべての Table1 行を含め、Table2 で created_at を使用して結果を並べ替えます。Table2 レコードがない場合、そのレコードの順序付けに Table1 の created_at を使用できるようにしたいと考えています。

例:

Table 1 (id, created_at)  
1, 100  
2, 200  
3, 300  
4, 400  

Table 2 (id, table1_id, created_at)  
1, 1, 500  
2, 1, 450  
3, 2, 350  

そして、クエリは結果 (t1.id、t1.created_at、t2.id、t2.created_at) を返します。

1, 100, 1, 500  
4, 400, --, --  
2, 200, 2, 350  
3, 300, --, --  

Postgresql を使用しています。これを達成するための最良のクエリ/メソッドは何ですか?

4

2 に答える 2

3
select t1.id, t1.created_at, t2.id, t2.created_at
from
    table1 t1 
    left outer join (
        select id, max(created_at) created_at
        from table2
        group by id
    ) t2 on t1.id = t2.id
order by coalesce(f2.created_at, f1.created_at) desc;
于 2012-10-30T15:33:54.780 に答える
1

うまくいくように見えるクエリを思いついたと思います:

SELECT * FROM table1 AS t1 
LEFT OUTER JOIN table2 AS t2 ON (
    t2.t1_id = t1.id
    AND 
    t2.id = (SELECT tt2.id FROM table2 tt2 WHERE tt2.t1_id = t1.id ORDER BY created_at DESC LIMIT 1)
) ORDER BY COALESCE(f2.created_at, f1.created_at) DESC;

これがこれを行うための最良または最も効率的な方法であるかどうかわからないので、私はまだ提案を受け付けています.

于 2012-10-30T15:24:01.180 に答える