Mysql分組查詢(xún)每組最新的一條數(shù)據(jù)的五種實(shí)現(xiàn)過(guò)程
Mysql分組查詢(xún)每組最新的一條數(shù)據(jù)
代碼示例:
在MySQL中,獲取每個(gè)分組的最新一條數(shù)據(jù)是一個(gè)常見(jiàn)的查詢(xún)需求。
以下是五種實(shí)現(xiàn)該需求的方法:
1.使用子查詢(xún)和JOIN
通過(guò)子查詢(xún)先找出每個(gè)分組的最新記錄的日期,然后通過(guò)JOIN操作連接原表來(lái)獲取完整的記錄。
SELECT o.* FROM orders o INNER JOIN ( SELECT customer_id, MAX(order_date) AS latest_date FROM orders GROUP BY customer_id ) latest_orders ON o.customer_id = latest_orders.customer_id AND o.order_date = latest_orders.latest_date;
2.使用窗口函數(shù)(MySQL 8.0+)
如果你使用的是MySQL 8.0或更高版本,可以利用窗口函數(shù)ROW_NUMBER()
來(lái)實(shí)現(xiàn)。
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS rn FROM orders ) ranked_orders WHERE rn = 1;
3.使用變量(不推薦)
雖然不推薦使用變量來(lái)處理這類(lèi)問(wèn)題,但作為一種可能的方法,可以通過(guò)自連接和變量來(lái)實(shí)現(xiàn)。
SELECT t1.* FROM orders t1 LEFT JOIN orders t2 ON t1.customer_id = t2.customer_id AND t1.order_date < t2.order_date WHERE t2.customer_id IS NULL;
4.通過(guò)聚合函數(shù)和子查詢(xún)
使用聚合函數(shù)MAX()
來(lái)獲取每個(gè)分組的最新時(shí)間,然后通過(guò)子查詢(xún)來(lái)獲取對(duì)應(yīng)的完整記錄。
SELECT * FROM orders WHERE (customer_id, order_date) IN ( SELECT customer_id, MAX(order_date) FROM orders GROUP BY customer_id );
5.通過(guò)DISTINCT關(guān)鍵字
通過(guò)在子查詢(xún)中使用DISTINCT
關(guān)鍵字來(lái)打破MySQL語(yǔ)句優(yōu)化,使排序生效。
SELECT * FROM ( SELECT DISTINCT * FROM orders ORDER BY customer_id, order_date DESC ) AS latest GROUP BY customer_id;
以上方法中,推薦使用子查詢(xún)和JOIN操作或者窗口函數(shù),這些方法更清晰、效率更高。
使用變量的方法雖然可行,但通常不是最佳實(shí)踐。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- MySQL分組查詢(xún)獲取每組最新的一條數(shù)據(jù)詳解(group?by)
- Mysql分組查詢(xún)每組最新的一條數(shù)據(jù)的五種實(shí)現(xiàn)方法
- MYSQL數(shù)據(jù)庫(kù)查詢(xún)按日期分組統(tǒng)計(jì)詳細(xì)代碼
- MySQL數(shù)據(jù)庫(kù)聚合函數(shù)與分組查詢(xún)舉例詳解
- Mysql分組查詢(xún)每組最新一條數(shù)據(jù)的三種實(shí)現(xiàn)方法
- MySql數(shù)據(jù)庫(kù)基礎(chǔ)之分組查詢(xún)?cè)斀?/a>
- MySQL數(shù)據(jù)庫(kù)分組查詢(xún)group by語(yǔ)句詳解
相關(guān)文章
mysql 8.0.20 winx64.zip壓縮版安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了mysql 8.0.20 winx64.zip壓縮版安裝配置方法圖文教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05Mysql查詢(xún)時(shí)間區(qū)間日期列表實(shí)例代碼
最近常用到mysql的日期范圍搜索,下面這篇文章主要給大家介紹了關(guān)于Mysql查詢(xún)時(shí)間區(qū)間日期列表的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04mysql 數(shù)據(jù)插入優(yōu)化方法之concurrent_insert
在MyISAM里讀寫(xiě)操作是串行的,但當(dāng)對(duì)同一個(gè)表進(jìn)行查詢(xún)和插入操作時(shí),為了降低鎖競(jìng)爭(zhēng)的頻率,根據(jù)concurrent_insert的設(shè)置,MyISAM是可以并行處理查詢(xún)和插入的2021-07-07阿里云ECS centos6.8下安裝配置MySql5.7的教程
阿里云默認(rèn)yum命令下的MySQL是5.17****,安裝mysql5.7之前先卸載以前的版本。下面通過(guò)本文給大家介紹阿里云ECS centos6.8下安裝配置MySql5.7的教程,需要的的朋友參考下吧2017-07-07MYSQL隨機(jī)抽取查詢(xún) MySQL Order By Rand()效率問(wèn)題
MYSQL隨機(jī)抽取查詢(xún):MySQL Order By Rand()效率問(wèn)題一直是開(kāi)發(fā)人員的常見(jiàn)問(wèn)題,俺們不是DBA,沒(méi)有那么牛B,所只能慢慢研究咯,最近由于項(xiàng)目問(wèn)題,需要大概研究了一下MYSQL的隨機(jī)抽取實(shí)現(xiàn)方法2011-11-11Windows7下安裝使用MySQL8.0.16修改密碼、連接Navicat問(wèn)題
這篇文章主要介紹了Windows7下安裝使用MySQL8.0.16修改密碼、連接Navicat問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06