mysql分组问题

2020-01-07  本文已影响0人  领带衬有黄金

异常图片

异常

sql语句:

select b.label_id,a.label_name,count(a.label_name) as count from quick_poll_label as a 
left join quick_poll_alerts_label as b on a.id = b.label_id group by a.label_name;

异常说明:

解释一:

对于group by聚合操作,如果在select中的列没有在group by中出现,那么这个SQL是不合法的,因为列不在group by从句中,所以设置了sql_mode=only_full_group_by 的数据库,在使用group by时就会报错。

解释二:

使用这个就是使用和oracle一样的group 规则, select的列都要在group中,或者本身是聚合列(SUM,AVG,MAX,MIN) 才行,其实这个配置目前个人感觉和distinct差不多的,所以去掉就好。

官方解释:

MySQL 5.7.5及更高版本实现了对功能依赖性的检测。如果ONLY_FULL_GROUP_BY启用了 SQL模式(默认情况下为SQL模式),则MySQL拒绝查询,其中选择列表,HAVING条件或 ORDER BY列表引用的是GROUP BY未在子句中命名且在功能上不依赖于它们的未聚合的列。(在5.7.5之前,MySQL不会检测功能依赖关系,并且 ONLY_FULL_GROUP_BY默认情况下未启用。

相关链接

修改方式:

永久性修改在配置文件中修改

windows系统在my.ini中修改,配置文件位置在服务中查看

image.png

修改-->

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

linux系统在etc/my.cnf中

在文件的最后加上

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

不区分系统不修改配置,在没有参与group by的情况下,在字段上使用any_value(字段)函数,即可。

select any_value(a.id),a.label_name,count(a.label_name) as count from quick_poll_label as a left join quick_poll_alerts_label as b on a.id = b.label_id group by a.label_name;
上一篇下一篇

猜你喜欢

热点阅读