MySQL如何查询每位客户的最近最多3条订单记录
MySQL 查询语句实现方案
方案1:MySQL 8.0+ 版本(推荐,使用窗口函数)
利用ROW_NUMBER()窗口函数按客户分组打序号,过滤取最近3条后拼接即可,语句更简洁易读:
SELECT Name, GROUP_CONCAT(Price ORDER BY Year DESC SEPARATOR ' ') AS order_prices FROM ( SELECT Name, Price, Year, -- 按客户分组,订单按年份从新到旧排序编序号 ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Year DESC) AS row_num FROM Orders ) AS filtered_orders WHERE row_num <= 3 -- 取最近最多3条 GROUP BY Name;
方案2:MySQL 5.x 兼容版本(无窗口函数支持)
通过关联子查询实现最近3条的过滤逻辑,兼容低版本MySQL:
SELECT o1.Name, GROUP_CONCAT(o1.Price ORDER BY o1.Year DESC SEPARATOR ' ') AS order_prices FROM Orders o1 WHERE ( -- 统计同客户下年份大于等于当前订单的数量,<=3说明属于最近3条 SELECT COUNT(*) FROM Orders o2 WHERE o2.Name = o1.Name AND o2.Year >= o1.Year ) <= 3 GROUP BY o1.Name;
两个方案执行后输出都和预期完全一致:
| Name | order_prices |
|---|---|
| Ram | 30 40 50 |
| Shaam | 70 20 |
注:如果实际场景拼接内容过长,可提前执行
SET group_concat_max_len = 10240;调整GROUP_CONCAT的长度上限,当前需求最多拼接3个值无需调整。
内容的提问来源于stack exchange,提问作者Simran Goyal
相关产品推荐
相关产品推荐

