MySQL使用SELECT、COUNT、GROUP BY统计报错#1055问题求助
解决MySQL中GROUP BY的1055错误问题
这个报错的核心原因是MySQL启用了only_full_group_by严格模式,而你的SQL语句违反了这个模式的规则:SELECT列表里的非聚合列date既没有出现在GROUP BY子句中,也和GROUP BY的列DAY(date)没有功能依赖关系,所以触发了1055错误。MariaDB默认没有开启这个严格模式,因此可以正常执行。
下面给你两种可行的解决方案:
方案1:调整SQL语句,符合only_full_group_by规则
既然你是按天统计,我们可以对date列使用聚合函数(比如MIN()或MAX()),这样SELECT的列就属于聚合结果,符合模式要求。同时注意:排序应该用ORDER BY,GROUP BY后面不需要加ASC(这是语法错误,MariaDB可能忽略了这个问题)。修改后的SQL如下:
SELECT MIN(date) AS date, COUNT(id_master_post) FROM master_post GROUP BY DAY(date) ORDER BY DAY(date) ASC;
这里MIN(date)会返回当天的最早日期,你也可以根据需求换成MAX(date)获取当天最晚日期。
方案2:关闭only_full_group_by模式
如果你想保留原来的SQL写法,可以临时或永久关闭这个严格模式:
临时生效(重启MySQL后失效)
执行以下SQL语句:
SET sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
永久生效(需要修改配置文件)
找到MySQL的配置文件(Linux下通常是/etc/my.cnf或/etc/mysql/my.cnf,Windows下是my.ini),找到sql_mode配置项,移除其中的ONLY_FULL_GROUP_BY,示例配置如下:
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
修改后重启MySQL服务即可生效。
内容的提问来源于stack exchange,提问作者AniSong Lyrics
相关产品推荐
相关产品推荐

