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中得出的结果是正确的,是安装我想要的结果排序的
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_gid中最新的一条
但是在5.7的版本中就不是这个结果了,可以自己试试
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 修改下模式就能解决了