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

SQL语法错误1064排查:查询游历最多英雄语句报错修复

排查与修复:SQL 1064语法错误及游历最多城市英雄查询

先直接点出你的核心问题:原SQL的子查询结构完全混乱,再加上拼写错误,直接触发了1064语法错误。下面一步步拆解问题,再给你修复后的语句。

原SQL的错误点

  • 子查询结构非法:在sub1的SELECT列表里,你同时写了ID_Heros、COUNT(ID_ville),还有一个(SELECT * FROM etape RIGHT JOIN participe ...)的子查询。GROUP BY规则要求SELECT里的非聚合列必须是分组列,这个SELECT *子查询既不是分组列也不是聚合函数,MySQL直接判定语法错误。
  • 拼写错误:把表名participe写成了pqrticipe,这也是触发报错的诱因之一。
  • 列名匹配问题:关联heros表时,sub2.ID_Heros和heros.ID_Héros存在重音差异(看你的表结构截图,heros表主键是ID_Héros),虽然MySQL可能不区分大小写/重音,但严格对应能避免潜在问题。
  • 统计逻辑不严谨:原语句用COUNT(ID_ville),如果同一个英雄多次前往同一城市会重复计数,应该用COUNT(DISTINCT ID_ville)统计不同城市的数量,才符合你的需求。

修复后的SQL语句

根据你的需求(找出游历过最多不同城市的英雄),重新梳理逻辑后的正确语句:

SELECT h.Nom, h.Prenom
FROM (
    -- 先统计每个英雄游历的不同城市数量,按数量降序取前1
    SELECT 
        p.ID_Heros,
        COUNT(DISTINCT e.ID_ville) AS city_count
    FROM participe p
    JOIN etape e ON p.ID_Expedition = e.ID_Expedition
    GROUP BY p.ID_Heros
    ORDER BY city_count DESC
    LIMIT 1
) AS hero_city_stats
JOIN heros h ON hero_city_stats.ID_Heros = h.ID_Héros;

逻辑说明

  1. 先关联participe(英雄参与的远征)和etape(远征途经的城市),得到每个英雄对应的所有城市记录。
  2. 按英雄ID分组,用COUNT(DISTINCT e.ID_ville)统计每个英雄去过的不同城市总数。
  3. 按城市数量降序排序,LIMIT 1取数量最多的那个英雄(如果有多个英雄并列第一,这个语句只会返回一个,要是需要返回所有并列的,可以用窗口函数)。
  4. 最后关联heros表,取出英雄的姓名。

可选优化(处理并列情况):如果你的MySQL版本是8.0+,支持窗口函数,可以用以下语句返回所有游历城市数量最多的英雄:

SELECT h.Nom, h.Prenom, hero_city_stats.city_count
FROM (
    SELECT 
        p.ID_Heros,
        COUNT(DISTINCT e.ID_ville) AS city_count,
        RANK() OVER(ORDER BY COUNT(DISTINCT e.ID_ville) DESC) AS rnk
    FROM participe p
    JOIN etape e ON p.ID_Expedition = e.ID_Expedition
    GROUP BY p.ID_Heros
) AS hero_city_stats
JOIN heros h ON hero_city_stats.ID_Heros = h.ID_Héros
WHERE hero_city_stats.rnk = 1;

内容的提问来源于stack exchange,提问作者Danny boon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:28:29