MySQL使用group by分組查詢每組最新的一筆數據實現方式
問題來源
今天遇到一個查詢數據庫數據的問題:要獲取每個分組最新的一筆數據,并將每個分組最新的一筆數據重新組成一個新的列表
這種場景,當然是想到了分組查詢,使用 group by,思路也很清晰:
- 將所有記錄根據時間 order by desc ,倒敘排列一遍
- 將第1步中的數據,group by 一下,就能得到想要的列表
按這個思路,得到的 sql 語句如下:
select * from ( select * from company_info where company_name = 'xxxxx科技有限公司' order by create_time desc ) t group by t.department;
思路沒有問題,語句也沒有問題,但執(zhí)行后,卻怎么也得不到想要的結果
這里有一個大坑,那就是從 mysql 5.7 開始,對于子查詢的排序,其實是不生效的,意思就是下面這個子查詢語句的排序,對于整體而言無效,所以最終得不到想要的結果
select * from company_info where company_name = 'xxxxx科技有限公司' order by create_time desc
解決方式
方式一
還是上面的思路,只要加上一個 limit 就可以拿到想要的結果了,語句如下:
select * from ( select * from company_info where company_name = 'xxxxx科技有限公司' order by create_time desc limit 1000 ) t group by t.department;
這個就算是在 mysql 5.7 及更高的版本也能跑,親測可用。
至于 limit 后面的數字是 1000 還是 10000,可以根據具體的業(yè)務場景設置
方式二
聯(lián)表查詢,實現的語句如下:
select * from ( select department, max(create_time) as date_time from company_info where company_name = 'xxxxx科技有限公司' group by department ) a left join company_info t on t.department = a.department and t.create_time = a.date_time;
使用 max 函數獲取最新的 create_time 和 department,并分組,然后作為一張表 a 和原來的表 t 進行聯(lián)查
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
MySQL?原理與優(yōu)化之Limit?查詢優(yōu)化
這篇文章主要介紹了MySQL?原理與優(yōu)化之Limit?查詢優(yōu)化,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08
mysql中find_in_set()函數用法及自定義增強函數詳解
這篇文章主要給大家介紹了關于mysql中find_in_set()函數用法及自定義增強函數的相關資料,在MySQL 數據庫中進行復雜的查詢語句,例如對多個字段進行篩選和排序,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-06-06

