MySQL5.7 之后,也不允许 select 不在 group by 中的列,但是 join 之后就允许,这是为何? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abcbuzhiming
V2EX    数据库

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

  •  
  •   abcbuzhiming 2018-09-04 15:15:42 +08:00 3463 次点击
    这是一个创建于 2668 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这是无意中发现的。MySQL5.7 后,为了让自己更符合 ASNI 的标准,不允许 select 不在 group 中的 lie,比如下列语句就不合法:
    selet 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     Solana     1239 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 23:51 PVG 07:51 LAX 15:51 JFK 18:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86