3

テーブル構造

id (p) | date | id2 (fk) | id3 (fk)

ここで、(p)はプライマリID、(fk)は外部キーです。

このクエリは、最新の一意の行のリストを返します

select
    max(date) as date1,
    id1,
    id2
from `table`
group by id1, id2

また、2番目に高い日付である必要がある2番目の日付を続けて表示したいと思います

何かのようなもの

select
    max(date) as date1,
    max_second(date) as date2,
    id1,
    id2
from `table`
group by id1, id2
4

1 に答える 1

6

テーブルをそれ自体に結合し、id列と一致しますが、結合されたテーブルの行の日付がメインテーブルの行よりも小さい場合は一致します(これがキーです)。

select
    max(t1.date) as date1,
    max(t2.date) as date2,
    t1.id2,
    t1.id2
from `table` t1
left join `table` t2 on t2.id1 = t1.id1 and t2.id2 = t1.id2 and t2.date < t1.date
group by id1, id2;

date2前の日付の行がない場合があることに注意してくださいnull(したがって、が必要ですleft join

id1またはid2、あるいはその両方にインデックスがない限り、このクエリは永遠にかかります。
最高速度を得るには、次のようにします。

create index table_id1_id2 on `table`(id1, id2);

それが十分に速くない場合は、これを実行した後に速度を試してください:

create index table_id1_id2_date on `table`(id1, id2, date);
于 2012-06-22T10:53:05.797 に答える