分组查询每组最新的一条数据
一、常规写法
SELECT
*
FROM
( SELECT * FROM customer_wallet_detail ORDER BY create_time DESC ) t1
GROUP BY t1.customer_id;
1.结果:
这里可以发现并没有根据时间倒序,查询出最新的一条数据
2.分析:
在 MySQL5.7 以及之后的版本,如果 GROUP BY 的子查询中包含 ORDER BY,但是 GROUP BY 不与 LIMIT 或 DISTINCT 等特殊查询配合使用,ORDER BY会被忽略掉;
所以子查询在 GROUP BY 时排序不会生效,可能是因为子查询大多数是作为一个结果给主查询使用,所以子查询不需要排序,在MySQL内置语句优化器中会将将这条查询语句优化,可以查看执行计划。
3.解决思路:
如果想要在分组前排序只要打破MySQL语句优化就行,可以通过LIMIT、DISTINCT、MAX() 等操作实现,下面会给出三种实现方法。
二、实现方法一(使用 limit 查询)
SELECT
*
FROM
( SELECT * FROM customer_wallet_detail ORDER BY create_time DESC LIMIT 9 ) t1
GROUP BY t1.customer_id;
三、实现方法二(使用 DISTINCT 查询)
SELECT
*
FROM
( SELECT DISTINCT * FROM `customer_wallet_detail` ORDER BY create_time DESC ) AS t1
GROUP BY t1.customer_id;
四、实现方法三(使用 MAX(id) 查询)(推荐)
只适用于自增ID和创建时间排序一致,查询性能最优
SELECT
t1.*
FROM
customer_wallet_detail t1
INNER JOIN ( SELECT MAX( id ) AS id FROM customer_wallet_detail GROUP BY customer_id ) t2 ON t1.id = t2.id
540

被折叠的 条评论
为什么被折叠?



