V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abcbuzhiming
V2EX  ›  数据库

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

  •  
  •   abcbuzhiming · 2018-09-04 15:15:42 +08:00 · 3201 次点击
    这是一个创建于 2306 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这是无意中发现的。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 还是什么
    第 1 条附言  ·  2018-09-04 16:47:48 +08:00
    对不起,各位,我弄错了,我再次测试过后发现,引发这个现象的并不是联表,而是一个 where 语句,整个语句是这么写的
    select id, name from user where id=16 group by name

    只要加上了 where id=16 这个条件,这条语句就是成立的并能出现结果(注意,虽然这里用 id,但是实际上 id 记录不止一条,id 并非不重复字段)。
    这个问题我在 mysql 的文档里也没找到答案
    我的进一步试验表明,只能有一个 where 条件,如果 where id=16 or id = 15 就不行,where id in (xx,xx,xx)。也不行。仅仅在 id 只有一个 where 过滤条件时就能成立,
    8 条回复    2018-09-04 16:24:47 +08:00
    nosay
        1
    nosay  
       2018-09-04 15:38:31 +08:00
    不允许 select 不在 group 中的列?

    确定吗?我去试了一下,可以执行啊,我是 mysql8.0.3
    cncqw
        2
    cncqw  
       2018-09-04 15:51:15 +08:00
    实际上 MySQL5.7 这样设计才是正确的,5.7 的 sql_mode 有一个 ONLY_FULL_GROUP_BY 配置项,查不在 group 中的列其实没有什么意义,不是 bug,只是 MySQL 更加趋向于严格模式
    cdlixucd
        3
    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
        4
    xy90321  
       2018-09-04 15:59:55 +08:00 via iPhone
    允许非 group by 项目在不带分组函数的情况下被 select 才是奇怪的吧!
    zjp
        5
    zjp  
       2018-09-04 15:59:56 +08:00
    @nosay 可能是你修改了配置,默认的 sql_mode 禁止这样做

    @cncqw 楼主说的是 8.0 又可以通过 join 绕过限制了...问这是不是 bug。
    nosay
        6
    nosay  
       2018-09-04 16:01:37 +08:00
    @cncqw
    @zjp
    嗯,是的,我查看了一下 sql_mode 确实没有开启 ONLY_FULL_GROUP_BY,学习了。
    zjp
        7
    zjp  
       2018-09-04 16:03:43 +08:00
    楼主能给出表定义吗,我测试还是不行...
    Felldeadbird
        8
    Felldeadbird  
       2018-09-04 16:24:47 +08:00
    如果两条数据 group by,会存在 到底取 第一行数据,还是第二行 作为标准呢?二选一的情况,楼主应该有遇到过这个情况。
    不过,对于习惯了之前写法的,确实觉得 5.7 的做法反人类……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1209 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:06 · PVG 02:06 · LAX 10:06 · JFK 13:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.