关于朋友随手抛出的一段 SQL,发现 MySQL 中关于 max()和 group by 联合使用中的一个坑,特此整理。
YH:老铁们,这段 hql 对不对啊
我扫了一眼,总觉得看着别扭,自己试着去掉字符串拼接,还原出 SQL 来看,依然感觉不对,然后自己试着写了查询,在本地建个表,造了些数据,用简化后的 SQL 做测试时, 当我定睛检查以下这句 SQL
select predictId, max(evaluateDate) evalDate, productId from productcashpredict group by productId; 抛出一个疑问,MySQL 是从后往前执行,先分组再求分组结果中 evaluateDate 最大的记录呢?还是先找出 evaluateDate 的最大记录,再分组呢?
网上查了查,发现,都不是!这里有个坑!如果直接这么结合 max 和 group by 使用,查出的结果,除了求 max 的字段和分组条件 productId 字段,其他字段的值都是错的!
首先我在本地验证了一下是不是的确如此
desc productcashpredict; predictId int(11) NO PRI auto_increment evaluateDate datetime YES on update CURRENT_TIMESTAMP other varchar(255) YES productId int(11) YES select * from productcashpredict +-----------+---------------------+-------+-----------+ | predictId | evaluateDate | other | productId | +-----------+---------------------+-------+-----------+ | 1 | 2017-10-31 18:14:37 | NULL | 10001 | | 2 | 2017-10-31 18:14:45 | NULL | 10002 | | 3 | 2017-10-31 18:14:59 | NULL | 10002 | | 4 | 2017-10-31 18:15:09 | NULL | 10003 | | 5 | 2017-10-31 18:15:22 | NULL | 10001 | +-----------+---------------------+-------+-----------+ select predictId, max(evaluateDate) evalDate, productId from productcashpredict group by productId; +-----------+---------------------+-----------+ | predictId | evalDate | productId | +-----------+---------------------+-----------+ | 1 | 2017-10-31 18:15:22 | 10001 | | 2 | 2017-10-31 18:14:59 | 10002 | | 4 | 2017-10-31 18:15:09 | 10003 | +-----------+---------------------+-----------+ 直接这样查的确是错的,看 predictId 可以看出...