2012-06-22 53 views
3

表結構多最大結果

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

其中(P)是主ID和(FK)是外鍵

該查詢返回最新的獨特行的列表

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

我還想連續第二次約會,必須是第二次約會

類似於

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

回答

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); 
+0

這樣的作品,謝謝。儘管完成這個查詢幾乎是永遠需要的 – abr

+0

查看編輯答案重新索引 – Bohemian

+0

......現在它就像一個火箭)再次感謝 – abr