MySQL使用group by分組查詢每組最新的一筆數(shù)據(jù)實(shí)現(xiàn)方式
問題來源
今天遇到一個(gè)查詢數(shù)據(jù)庫數(shù)據(jù)的問題:要獲取每個(gè)分組最新的一筆數(shù)據(jù),并將每個(gè)分組最新的一筆數(shù)據(jù)重新組成一個(gè)新的列表
這種場景,當(dāng)然是想到了分組查詢,使用 group by,思路也很清晰:
- 將所有記錄根據(jù)時(shí)間 order by desc ,倒敘排列一遍
- 將第1步中的數(shù)據(jù),group by 一下,就能得到想要的列表
按這個(gè)思路,得到的 sql 語句如下:
select * from ( select * from company_info where company_name = 'xxxxx科技有限公司' order by create_time desc ) t group by t.department;
思路沒有問題,語句也沒有問題,但執(zhí)行后,卻怎么也得不到想要的結(jié)果
這里有一個(gè)大坑,那就是從 mysql 5.7 開始,對于子查詢的排序,其實(shí)是不生效的,意思就是下面這個(gè)子查詢語句的排序,對于整體而言無效,所以最終得不到想要的結(jié)果
select * from company_info where company_name = 'xxxxx科技有限公司' order by create_time desc
解決方式
方式一
還是上面的思路,只要加上一個(gè) limit 就可以拿到想要的結(jié)果了,語句如下:
select * from ( select * from company_info where company_name = 'xxxxx科技有限公司' order by create_time desc limit 1000 ) t group by t.department;
這個(gè)就算是在 mysql 5.7 及更高的版本也能跑,親測可用。
至于 limit 后面的數(shù)字是 1000 還是 10000,可以根據(jù)具體的業(yè)務(wù)場景設(shè)置
方式二
聯(lián)表查詢,實(shí)現(xià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 函數(shù)獲取最新的 create_time 和 department,并分組,然后作為一張表 a 和原來的表 t 進(jìn)行聯(lián)查
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL中隨機(jī)排序的幾種方法實(shí)現(xiàn)
MySQL實(shí)現(xiàn)隨機(jī)排序有多種方法,包括使用RAND()、UUID()函數(shù),排序字段的哈希值以及自定義函數(shù),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
MySQL實(shí)現(xiàn)類似于connect_by_isleaf的功能MySQL方法或存儲過程
這篇文章主要介紹了MySQL實(shí)現(xiàn)類似于connect_by_isleaf的功能MySQL方法或存儲過程,需要的朋友可以參考下2017-02-02
使用python連接mysql數(shù)據(jù)庫之pymysql模塊的使用
這篇文章主要介紹了使用python連接mysql數(shù)據(jù)庫之pymysql模塊的使用,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
window下mysql 8.0.15 安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了window下mysql 8.0.15 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
MySQL處理重復(fù)數(shù)據(jù)插入的處理方案
在數(shù)據(jù)庫操作中,處理重復(fù)數(shù)據(jù)插入是一個(gè)常見的需求,特別是在批量插入數(shù)據(jù)時(shí),可能會遇到主鍵沖突或唯一鍵沖突(Duplicate entry)的情況,本文將以一個(gè)實(shí)際的Python MySQL數(shù)據(jù)庫操作為例,分析如何優(yōu)化異常處理邏輯,需要的朋友可以參考下2025-04-04
Java實(shí)現(xiàn)獲得MySQL數(shù)據(jù)庫中所有表的記錄總數(shù)可行方法
可以通過SELECT COUNT(*) FROM table_name查詢某個(gè)表中有多少條記錄。本文給出兩種可行的Java程序查詢所有別的記錄方法,感興趣朋友可以了解下2013-06-06

