在工作中,有个业务逻辑【类似】需要获取每个用户最高的奖励金额,一开始想到的是先使用group by 对用户进行分组, 再order by 按照时间降序排列。
(第一次尝试)于是执行sql语句:
SELECT * FROM reward GROUP BY uid ORDER BY money desc
结果不符合预期: roup by 和 order by 一起使用时,会先使用group by 分组,并取出分组后的第一条数据,所以后面的order by 排序是根据取出来的第一条数据来排序的,但是第一条数据不一定是分组里面的最大数据
(第二次尝试)构建sql语句
SELECT * FROM (SELECT * FROM reward ORDER BY money desc)r GROUP BY r.uid
结果不符合预期:发现“mysql 5.7 中order by 和GROUP BY 一起使用 order by 不生效”,必须加上limit限制 ,避免系统会把order by优化掉。
最终写法:
SELECT * FROM (SELECT * FROM reward ORDER BY money desc limit 10000000000000)r GROUP BY r.uid // 但是此写法性能可能有问题。