mysql5.7不兼容5.6
发布于 8 年前 作者 Hmilyxy 14532 次浏览 来自 分享

SELECT * FROM (SELECT id, a_title, a_update_time, a_gid FROM articles WHERE a_gid in (4,5,6, 7) ORDER BY a_update_time DESC) a GROUP BY a_gid ORDER BY a_update_time DESC 5.6中得出的结果是正确的,是安装我想要的结果排序的 1236.png

SELECT id, a_title, a_update_time, a_gid FROM articles WHERE a_gid in (4,5,6, 7) ORDER BY a_update_time DESC这个查询语句的结果 162958703.png

得到就是我想要的分别取a_gid中最新的一条

但是在5.7的版本中就不是这个结果了,可以自己试试

8 回复

5.7大改了实现

我用5.7也遇到过很奇怪的问题

建议还是回5.5/5.6吧 SAD

之前我写过跟帖子中一样的语句,当时我就在想,这种用法的行为是不被sql规则所保证的,只能祈祷它的实现上刚好出来合适的结果。

select c.* from (
     select a.id, a.a_title, a.a_update_time, a.a_gid, count(*) as rank
     from articles a
     join articles b
       on a.a_gid = b.a_gid
     where a.a_gid in (4, 5, 6, 7) and a.a_update_time <= b.a_update_time
     group by a.id
   ) c
   where c.rank = 1;

试试这个吧,我没有实际跑过。

@alsotang 这句的空间复杂度可能较高,表大的时候不知道效率如何。不过 mysql 没有 pg 的 window 函数,所以如果你们表大的话,还是专门写个函数来并发取每个 a_gid 的最新一条吧。

看这个意思,5.7版本的group by 语句select非聚合的列不会选择组内第一行了吧?

任何不刷changlog就升级的都是耍流氓

瞧见了,再补充下吧,修改mysql的sql_mode模式 可以通过语句select @@sql_mode;查看当前使用模式

不要吓我,今天刚把5.6的mysql升级成了5.7的。

@stonephp 修改下模式就能解决了

回到顶部