You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL代码执行报错ERROR 1064 (42000),请求排查问题原因

SQL代码报错ERROR 1064的问题排查与原因解析

核心错误点及原因

  1. HAVING子句语法逻辑错误
    原代码中having tl_sub and tl_asub and tl_v and tl_uv != 0的写法不符合SQL语法规范。这种简化写法会让MySQL无法正确解析逻辑:单独的字段名会被当作布尔值处理,但你实际需要的是判断每个统计字段都不为0,必须为每个字段显式声明!= 0的条件。

  2. 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列表中,否则会触发语法或逻辑错误。

  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:53:21