美文网首页
MySQL 5.7以上版本的“this is incompati

MySQL 5.7以上版本的“this is incompati

作者: 小菜鸡 | 来源:发表于2020-12-23 15:29 被阅读0次

    MySQL 5.7以上的版本的sql_mode默认设置为only_full_group_by,也就是严格的group by分组。比如有表test_table:

    test_table

    有如下的查询语句:
    SELECT first_name, last_name FROM test_table GROUP BY first_name;
    报错如下:

    1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.test_table.last_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
    时间: 0s

    原因在于group by之后的结果是:

    group by first_name
    一个 first_name 对应了多个的 last_name ,MySQL在严格模式下就不知道该显示 last_name 的哪一行了。

    但是如果是用count/max/min/avg等聚合函数的话当然没有问题的,因为group by关键字 first_namelast_name 被聚合之后对应唯一个的一个结果:
    SELECT first_name, count( last_name ) FROM test_table GROUP BY first_name;

    count( last_name )

    也就是解决问题的关键在于让MySQL知道到底该显示那一个具体的值,使用group_concat可以解决这个问题:
    SELECT first_name, group_concat( last_name ) FROM test_table GROUP BY first_name;

    group_concat( last_name )

    但是这样会的话查询结果集在做对象封装的时候要得自己处理一下了。

    此外group_concat里面还可以进行排序,并选择连接使用的分隔符:
    SELECT first_name, group_concat( last_name ORDER BY last_name ASC SEPARATOR ';' ) FROM test_table GROUP BY first_name;

    group_concat

    也可以用any_value显示任意的一条记录:
    SELECT first_name, any_value ( last_name ) FROM test_table GROUP BY first_name;

    any_value( last_name )
    当然也可以考虑用其他的思路比如连接/子查询来做,也可以直接暴力修改 sql_mode 删除 only_full_group_by 字段以解除约束限制(不太推荐,因为数据库如果不止是你一个人在使用,可能会对别人有影响),看自己喜好了。

    参考:

    https://blog.csdn.net/allen_tsang/article/details/54892046
    https://www.cnblogs.com/zhwbqd/p/4205821.html?utm_source=tuicool&utm_medium=referral

    相关文章

      网友评论

          本文标题:MySQL 5.7以上版本的“this is incompati

          本文链接:https://www.haomeiwen.com/subject/clvynktx.html