今天為寫一條SQL困擾了很久
首先先貼兩條sql,大家看看有啥區別
select * from all_txt A where id=(SELECT id from all_txt
where A.key_value = key_value ORDER BY release_time DESC limit 1);
select * from (select *,max(release_time) as timea
from all_txt group by key_value order by release_time desc) a order by timea desc;
然後說明下表的重要欄位為三個id,key_value,release_time
作用是取每個相同key_value中release_time最新的資料
所有的資料為
id key_value release_time1 001 2007-11-012 001 2007-11-023 001 2007-11-034 002 2007-11-045 002 2007-11-056 003 2007-11-067 004 2007-11-078 004 2007-11-089 005 2007-11-0910 005 2007-11-10
現在要的結果為
id key_value release_time3 001 2007-11-035 002 2007-11-056 003 2007-11-068 004 2007-11-0810 005 2007-11-10
針對這些資料,顯示貌似都一樣
但仔細研究下來就會發現
第二句 返回的會是
id key_value timea release_time3 001 2007-11-03 2007-11-015 002 2007-11-05 2007-11-046 003 2007-11-06 2007-11-068 004 2007-11-08 2007-11-0710 005 2007-11-10 2007-11-09
用max求出來的資料timea是沒錯,是上面的release_time,但真實的release_time卻是不一樣的,那證明取的資料不是最新的那條的,而是給我感覺取的是物理位置上的第一條,這樣的話如果你還需要這張表的其他欄位就會有問題。
說了半天有人會說,那你就用第一種吧,執行下你就會發現,效能太差了,而第二種就很快,本以為能用第二種的,哎~~~~可能是對group by的本質還是瞭解不是很透徹
大家有啥更好的最佳化意見或方法,可以給我留言或加入qq群:47833489 討論