使用WHERE筛选的同表Inner JOIN SQL问题求助
问题分析与SQL修正
你的原SQL存在多处语法逻辑错误,且将两个独立查询需求错误合并,以下是分需求的修正方案:
原代码核心错误点
- 语法顺序错误:
WHERE子句不能放在JOIN之前,正确执行顺序为FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT - 日期错误:6月没有31日,需修正为
2022-06-30 - 同表自连接未使用别名,导致字段引用歧义
- 聚合函数
COUNT误用在WHERE子句中,筛选聚合结果需用HAVING - 自连接的
ON条件不完整,缺少师徒关联逻辑(假设表中有master_id字段标记徒弟的师父ID)
需求1:统计指定时段访问Tatoine的JEDI数量及等级
此需求无需自连接,直接过滤分组即可:
SELECT COUNT(DISTINCT jedi_id) AS jedi_total, rank_id FROM jedi WHERE date >= '2022-01-01' AND date <= '2022-06-30' AND planet = 'Tatoine' GROUP BY rank_id;
- 用
COUNT(DISTINCT jedi_id)避免同一JEDI多次访问被重复统计 - 修正了错误的日期范围
需求2:筛选Tatoine星球拥有1名以上Padawan的JEDI
通过同表自连接关联师徒关系,统计后筛选结果:
SELECT m.jedi_name AS jedi_name, COUNT(p.jedi_id) AS padawan_count, m.rank_id AS rank FROM jedi m INNER JOIN jedi p ON m.jedi_id = p.master_id -- 关联师父ID与徒弟的master_id字段 WHERE m.planet = 'Tatoine' GROUP BY m.jedi_id, m.jedi_name, m.rank_id HAVING COUNT(p.jedi_id) >= 2;
- 给表设置别名
m(师父)和p(徒弟),解决字段歧义 - 用
HAVING筛选聚合后的结果(Padawan数量≥2) - 若需限定师徒的访问时段,可在
WHERE中添加日期条件
内容的提问来源于stack exchange,提问作者Omar
相关产品推荐
相关产品推荐

