SQL代码执行报错ERROR 1064 (42000),请求排查问题原因
SQL代码报错ERROR 1064的问题排查与原因解析
核心错误点及原因
HAVING子句语法逻辑错误
原代码中having tl_sub and tl_asub and tl_v and tl_uv != 0的写法不符合SQL语法规范。这种简化写法会让MySQL无法正确解析逻辑:单独的字段名会被当作布尔值处理,但你实际需要的是判断每个统计字段都不为0,必须为每个字段显式声明!= 0的条件。GROUP BY与SELECT字段不匹配(MySQL严格模式下)
CTE的SELECT语句包含了c.name、s.total_submissions等非聚合字段,但GROUP BY仅指定了c.contest_id,c.hacker_id,ch.challenge_id。在MySQL 5.7及以上版本默认开启的ONLY_FULL_GROUP_BY模式下,SELECT中的非聚合字段必须出现在GROUP BY列表中,否则会触发语法或逻辑错误。INNER JOIN导致数据丢失(非语法错误,但易不符合业务预期)
使用INNER JOIN会过滤掉没有对应视图/提交统计的挑战记录,若你的需求是保留所有挑战的统计(即使为0),应该改用LEFT JOIN。
修正后的代码
WITH CTE_contest as ( SELECT c.contest_id, c.hacker_id, c.name, SUM(s.total_submissions) as total_submissions, SUM(s.total_accepted_submissions) as total_accepted_submissions, SUM(v.total_views) as total_views, SUM(v.total_unique_views) as total_unique_views FROM contests c JOIN colleges cg on c.contest_id = cg.contest_id JOIN challenges ch on cg.college_id = ch.college_id LEFT JOIN view_stats v on ch.challenge_id = v.challenge_id LEFT JOIN submission_stats s on ch.challenge_id = s.challenge_id GROUP BY c.contest_id, c.hacker_id, c.name, ch.challenge_id ) SELECT contest_id, hacker_id, name, SUM(total_submissions) as tl_sub, SUM(total_accepted_submissions) as tl_asub, SUM(total_views) as tl_v, SUM(total_unique_views) as tl_uv FROM CTE_contest GROUP BY contest_id, hacker_id, name HAVING tl_sub != 0 AND tl_asub != 0 AND tl_v != 0 AND tl_uv != 0 ORDER BY contest_id;
修正说明
- 修正HAVING子句,明确每个统计字段的非零判断条件
- 在CTE中对统计字段使用
SUM聚合,避免同一挑战多条统计记录导致的数据重复 - 将INNER JOIN替换为LEFT JOIN,确保所有挑战记录都被纳入统计
- 补充
c.name到GROUP BY列表,符合MySQL严格模式要求
内容的提问来源于stack exchange,提问作者karthik kb
相关产品推荐
相关产品推荐

