最新文章
- MySQL中, group by 和 order by 一起使用会有排序问题,group by 和 order by 同时使用时要注意的地方
- Vue学习笔记(10) ——Vue组件中的data和methods
- Vue学习笔记(9) ——Vue组件创建的几种方式
- Vue学习笔记(8) ——Vue实例的生命周期
- Vue学习笔记(7) —— 过滤器 filter的基本使用
- Vue学习笔记(6) ——v-if指令和v-show指令
- Vue学习笔记(5) —— v-for指令和key属性
- Vue学习笔记(5) —— Vue中样式-class样式和style样式
- Vue学习笔记(4) —— v-model指令,双向数据绑定
- Vue学习笔记(3) —— Vue事件修饰符
关注我

在线咨询
x
有什么可以帮到你

点击咨询
MySQL中, group by 和 order by 一起使用会有排序问题,group by 和 order by 同时使用时要注意的地方
- 分类:MySQL技术
- 时间:2020-12-12
- 共3065人围观
简介同时使用group by 和order by问题,group by 和 order by 一起使用问题, order by 和 group by 同时使用时要注意的地方
需求如下:
现在需要查询每个人领取的最高奖励并且从大到小排序
设计一张奖励表,表结构和表数据如下
-- ---------------------------- -- Table structure for reward -- ---------------------------- DROP TABLE IF EXISTS `reward`; CREATE TABLE `reward` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NULL DEFAULT '0' COMMENT '用户uid', `money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '奖励金额', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='奖励表'; -- ---------------------------- -- Records of reward -- ---------------------------- INSERT INTO `reward` VALUES ('1', '1', '300.00'); INSERT INTO `reward` VALUES ('2', '2', '100.00'); INSERT INTO `reward` VALUES ('3', '2', '600.00'); INSERT INTO `reward` VALUES ('4', '3', '500.00'); INSERT INTO `reward` VALUES ('5', '1', '500.00'); INSERT INTO `reward` VALUES ('6', '3', '200.00'); INSERT INTO `reward` VALUES ('7', '3', '700.00'); INSERT INTO `reward` VALUES ('8', '2', '400.00'); INSERT INTO `reward` VALUES ('9', '1', '360.00');
如图,我们得知各个uid最大对money, uid = 1 为 500, uid = 2 为 600, uid = 3 为 700
如果直接用group by和 group by查询
SELECT id, uid, money FROM reward GROUP BY uid ORDER BY money DESC;
得到如下结果
没有得到我们要的这个结果: uid = 1 为 500, uid = 2 为 600, uid = 3 为 700,那么,很显然的,这个sql是有问题的
原因: 这是因为group by 和 order by 一起使用时,会先使用group by 分组,并取出分组后的第一条数据,所以后面的order by 排序时根据取出来的第一条数据来排序的,但是第一条数据不一定是分组里面的最大数据。
解决方法一
如果不需要取得整条记录,则可以使用 max() 或 min()
SELECT id, uid, money, MAX(money) as max_money FROM reward GROUP BY uid ORDER BY MAX(money) DESC;
执行sql后的效果图
解决方法二
我们可以先排序,在分组,使用子查询
SELECT r.id, r.uid, r.money FROM (SELECT id, uid, money FROM reward ORDER BY money DESC LIMIT 9) r GROUP BY r.uid ORDER BY r.money DESC;
执行sql后的效果图
结论:
可能你已经发现了,使用max()取得的记录,money字段和max(money)字段不一致,这是因为这里只是取出了该uid的最大值,但是该最大值对应的整条记录没有取出来。
如果需要取得整条记录,则不能使用这种方法,可以使用子查询。
上一篇:MySQL 中 GROUP_CONCAT() 的使用
返回列表:MySQL技术