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;
逻辑说明
- 先关联
participe(英雄参与的远征)和etape(远征途经的城市),得到每个英雄对应的所有城市记录。 - 按英雄ID分组,用
COUNT(DISTINCT e.ID_ville)统计每个英雄去过的不同城市总数。 - 按城市数量降序排序,
LIMIT 1取数量最多的那个英雄(如果有多个英雄并列第一,这个语句只会返回一个,要是需要返回所有并列的,可以用窗口函数)。 - 最后关联
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
相关产品推荐
相关产品推荐

