关注我

    我的微信
在线咨询 x
在线咨询
有什么可以帮到你
点击咨询

MySQL中, group by 和 order by 一起使用会有排序问题,group by 和 order by 同时使用时要注意的地方

简介同时使用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


各个uid最大对money.png



如果直接用group by和 group by查询

SELECT id, uid, money FROM reward GROUP BY uid ORDER BY money DESC;


得到如下结果

MySQL中, group by 和 order by 一起使用会有排序问题,group by 和  order by  同时使用时要注意的地方.png


没有得到我们要的这个结果: 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后的效果图

MySQL中, group by 和 order by 一起使用会有排序问题,group by 和  order by  同时使用时要注意的地方.png



解决方法二


我们可以先排序,在分组,使用子查询

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后的效果图


MySQL中, group by 和 order by 一起使用会有排序问题,group by 和  order by  同时使用时要注意的地方.png


结论:

可能你已经发现了,使用max()取得的记录,money字段和max(money)字段不一致,这是因为这里只是取出了该uid的最大值,但是该最大值对应的整条记录没有取出来。

如果需要取得整条记录,则不能使用这种方法,可以使用子查询。



上一篇:MySQL 中 GROUP_CONCAT() 的使用

返回列表:MySQL技术