MySQL5.7 之后,也不允许 select 不在 group by 中的列,但是 join 之后就允许,这是为何?

2018-09-04 15:15:42 +08:00
 abcbuzhiming
这是无意中发现的。MySQL5.7 后,为了让自己更符合 ASNI 的标准,不允许 select 不在 group 中的 lie,比如下列语句就不合法:
select id, name from user group by name
但是神奇的是,只要加上 join 就能绕过
select user.id, user.name, class_name from user left join class_info on user.class_id = class_info.id
group by user.name, class_name
这到底是 bug 还是什么
3201 次点击
所在节点    数据库
8 条回复
nosay
2018-09-04 15:38:31 +08:00
不允许 select 不在 group 中的列?

确定吗?我去试了一下,可以执行啊,我是 mysql8.0.3
cncqw
2018-09-04 15:51:15 +08:00
实际上 MySQL5.7 这样设计才是正确的,5.7 的 sql_mode 有一个 ONLY_FULL_GROUP_BY 配置项,查不在 group 中的列其实没有什么意义,不是 bug,只是 MySQL 更加趋向于严格模式
cdlixucd
2018-09-04 15:52:38 +08:00
@nosay 我执行了报错‘ ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.Persons.LastName' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by ’
xy90321
2018-09-04 15:59:55 +08:00
允许非 group by 项目在不带分组函数的情况下被 select 才是奇怪的吧!
zjp
2018-09-04 15:59:56 +08:00
@nosay 可能是你修改了配置,默认的 sql_mode 禁止这样做

@cncqw 楼主说的是 8.0 又可以通过 join 绕过限制了...问这是不是 bug。
nosay
2018-09-04 16:01:37 +08:00
@cncqw
@zjp
嗯,是的,我查看了一下 sql_mode 确实没有开启 ONLY_FULL_GROUP_BY,学习了。
zjp
2018-09-04 16:03:43 +08:00
楼主能给出表定义吗,我测试还是不行...
Felldeadbird
2018-09-04 16:24:47 +08:00
如果两条数据 group by,会存在 到底取 第一行数据,还是第二行 作为标准呢?二选一的情况,楼主应该有遇到过这个情况。
不过,对于习惯了之前写法的,确实觉得 5.7 的做法反人类……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/486031

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX