MySQL #1055报错:仅按pu.pu_ward_name分组的解决方案咨询
解决MySQL GROUP BY仅按pu.pu_ward_name分组的报错问题
兄弟,这个#1055报错我太熟了——这完全是MySQL的only_full_group_by模式在“严格把关”!它的核心规则是:SELECT列表里的每一列,要么出现在GROUP BY子句中,要么被聚合函数(比如SUM、MAX、MIN)包裹,否则就会判定你可能拿到不符合预期的分组结果。
你当前的查询里,entry_date、pu.o_code、pu.pu_lga_name这些列既不在GROUP BY里,也没被聚合,自然触发了这个错误。下面给你两种解决方案,优先推荐第一种(符合SQL标准):
方案一:给非分组/非聚合列添加聚合函数(推荐)
如果像pu.pu_lga_name、pu.pu_ward_code这类字段,同一个pu.pu_ward_name分组下的所有行值都是唯一的,那用MAX()或MIN()包裹它们完全不影响结果(因为同一组里值都一样,聚合后还是原数值);而像entry_date这类可能有多个值的字段,你可以根据业务需求选择取最大、最小或其他聚合逻辑。
修改后的查询语句如下:
SELECT pu.pu_ward_name, MAX(entry_date) AS entry_date, -- 按需求换成MIN()也可以 MAX(pu.o_code) AS o_code, pu.pu_ward_name, MAX(pu.pu_lga_name) AS pu_lga_name, MAX(pu.pu_code) AS pu_code, MAX(pu.pu_ward_code) AS pu_ward_code, MAX(pu.pu_lga_code) AS pu_lga_code, MAX(pu.pu_voters_reg_count) AS pu_voters_reg_count, SUM(total_vote_cast) AS total_vote_cast, SUM(apc_total_vote) AS apc_total_vote, SUM(pdp_total_vote) AS pdp_total_vote, SUM(adp) AS adp, MAX(ward_name) AS ward_name -- 因为r.ward_name和pu.pu_ward_name关联,聚合后结果一致 FROM post_election_info r LEFT JOIN polling_unit pu ON r.ward_name = pu.pu_ward_name WHERE lga_name = 'BORIPE' GROUP BY pu.pu_ward_name;
方案二:临时关闭only_full_group_by模式(不推荐)
这个方法属于“绕开规则”,虽然能快速解决报错,但可能导致分组结果不符合预期(比如同一分组里的非聚合列会随机取一行的值),只适合临时测试场景:
- 先查看当前的SQL模式:
SELECT @@sql_mode;
- 移除
only_full_group_by并设置新的SQL模式(会话级,重启MySQL后失效):
SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
如果需要永久生效,得修改MySQL的配置文件(比如my.cnf或my.ini),找到sql_mode配置项去掉only_full_group_by,然后重启服务。
内容的提问来源于stack exchange,提问作者wealth ouseinfo
相关产品推荐
相关产品推荐

