在工作中,有个业务逻辑【类似】需要获取每个用户最高的奖励金额,一开始想到的是先使用group by 对用户进行分组,再order by 按照时间降序排列。(表结构和数据如下)SETNAMESutf8mb4;
SETFOREIGN_KEY_CHECKS=0;
------------------------------
--Tablestructureforreward
------------------------------
DROPTABLEIFEXISTS`reward`;
CREATETABLE`reward`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`uid`int(11)NOTNULLCOMMENT'用户uid',
`money`decimal(10,2)NOTNULLCOMMENT'奖励金额',
`datatime`datetime(0)NOTNULLCOMMENT'时间',
PRIMARYKEY(`id`)USINGBTREE
)ENGINE=InnoDBAUTO_INCREMENT=10CHARACTERSET=utf8COLLATE=utf8_general_ciCOMMENT='奖励表'ROW_FORMAT=Dynamic;
------------------------------
--Recordsofreward
------------------------------
INSERTINTO`reward`VALUES(1,111,300.00,'-12-1710:25:27');
INSERTINTO`reward`VALUES(2,222,100.00,'-12-1710:11:46');
INSERTINTO`reward`VALUES(3,222,600.00,'-12-1710:12:15');
INSERTINTO`reward`VALUES(4,333,500.00,'-12-1710:12:31');
INSERTINTO`reward`VALUES(5,111,500.00,'-12-1710:12:45');
INSERTINTO`reward`VALUES(6,333,200.00,'-12-1710:12:57');
INSERTINTO`reward`VALUES(7,333,700.00,'-12-1710:13:07');
INSERTINTO`reward`VALUES(8,222,400.00,'-12-1710:13:18');
INSERTINTO`reward`VALUES(9,111,350.00,'-12-1710:13:29');
SETFOREIGN_KEY_CHECKS=1;
(第一次尝试)于是执行sql语句:SELECT*FROMrewardGROUPBYuidORDERBYmoneydesc
第二次尝试(既然这样我们可以先排序,在分组,使用子查询。)SELECT*FROM(SELECT*FROMrewardORDERBYmoneydesc)rGROUPBYr.uid
发现得到的结果还是不是我想要的(查了许多资料 网上大神都是说通过子查询解决这个问题,有点打破我的认知了)
继续查找问题,发现我的mysql 版本是5.7,看到有条帖子“mysql 5.7 中order by 和GROUP BY 一起使用 order by 不生效”,必须加上limit限制 ,避免系统会把order by优化掉。
(第三次尝试)最终sql语句:SELECT*FROM(SELECT*FROMrewardORDERBYmoneydesclimit10000000000000)rGROUPBYr.uid