MySQL 5.7以上的版本的sql_mode
默认设置为only_full_group_by
,也就是严格的group by分组。比如有表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
之后的结果是:
一个 first_name 对应了多个的 last_name ,MySQL在严格模式下就不知道该显示 last_name 的哪一行了。
但是如果是用count/max/min/avg
等聚合函数的话当然没有问题的,因为group by
关键字 first_name 在 last_name 被聚合之后对应唯一个的一个结果:
SELECT first_name, count( last_name ) FROM test_table GROUP BY first_name;
也就是解决问题的关键在于让MySQL知道到底该显示那一个具体的值,使用group_concat
可以解决这个问题:
SELECT first_name, group_concat( last_name ) FROM test_table GROUP BY first_name;
但是这样会的话查询结果集在做对象封装的时候要得自己处理一下了。
此外group_concat
里面还可以进行排序,并选择连接使用的分隔符:
SELECT first_name, group_concat( last_name ORDER BY last_name ASC SEPARATOR ';' ) FROM test_table GROUP BY first_name;
也可以用any_value
显示任意的一条记录:
SELECT first_name, any_value ( last_name ) FROM test_table GROUP BY first_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