戳藍字「TopCoder」關注咱們哦!html
經過sql分組查詢數據時,通常經過group by來完成,group by默認取相同的分組列(一列或者多列)中第一個數據。mysql
若是想獲取sql分組中id最大的記錄,咱們可能想到的sql以下(name列做爲分組):web
select id,name from (select id,name from tt order by id desc) as t group by name
不過執行該sql發現並不能達到咱們的目的,輸出數據以下:sql
// 表數據以下:
id,name
1,name1
2,name1
3,name2
4,name2
select id,name from (select id,name from tt order by id desc) as t group by name
// 輸出結果以下:
id,name
1,name1
3,name2
這是爲何呢?由於mysql 5.6以後版本對排序的sql解析作了優化,子查詢中的排序是會被忽略的,因此上面的order by id desc未起到做用。若是子語句中排序不作優化那不就能夠了麼,查閱資料發現能夠在子語句中加上limit來避免這種優化(加上limit至關於臨時表限定了取值範圍不會進行優化,若是是全表的話就被優化掉了)。微信
// 加上limit
select id,name from (select id,name from tt order by id desc limit 1024) as t group by name
// 輸出結果以下:
id,name
2,name1
4,name2
除了上述這種直接經過group by分組獲得id最大記錄以外,還能夠經過分組獲取到最大記錄id,而後經過id獲取對應記錄(這裏的id只要是記錄的關鍵key便可)。app
// 經過分組獲取關鍵key,而後再獲取對應記錄
select id,name from tt where id in (select max(id) from tt group by name)
// 輸出結果以下:
id,name
2,name1
4,name2
其實除了group by獲取分組最後一個記錄以外,還能夠經過關聯子查詢方式來實現:優化
select id,name from tt a where id = (select max(id) from tt where name = a.name) order by name
// 輸出結果以下
id,name
2,name1
4,name2
經過以上group by和關聯子查詢兩種方式的實現,獲取分組的最後一條記錄要麼直接經過分組直接來獲取,要麼先獲取到記錄關鍵key而後經過關鍵key獲取對應的記錄便可。若是小夥伴還知道更多的實現方式,歡迎留言討論~spa
推薦閱讀 .net
本文分享自微信公衆號 - TopCoder(gh_12e4a74a5c9c)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。