SQL多表关联合并统计结果返回0,如何实现预期需求?
MySQL合并技能与框架项目统计结果的问题解决
你原有查询的核心问题是关联字段使用错误,导致合并查询返回0,以下是问题分析和解决方案:
问题根源
你的两个原始查询逻辑有误:
- 第一个查询中子查询选取的是
skill_id,然后用projects.id = s.skill_id关联,这实际是在找「项目ID等于技能ID7」的项目,而非「包含技能ID7」的项目; - 第二个查询同理,错误地用
projects.id = f.framework_id关联,找的是「项目ID等于框架ID3」的项目,而非「包含框架ID3」的项目。
当你合并两个错误查询时,相当于找项目ID同时等于7和3的项目,自然不存在,结果为0。
解决方案
根据你“合并统计结果”的不同需求,提供两种实现方式:
需求1:统计同时拥有skill_id=7和framework_id=3的项目数量
推荐用EXISTS子查询,效率更高且避免重复计数:
SELECT COUNT(*) AS count_both FROM projects p WHERE EXISTS ( SELECT 1 FROM project_skills ps WHERE ps.project_id = p.id AND ps.skill_id = 7 ) AND EXISTS ( SELECT 1 FROM project_frameworks pf WHERE pf.project_id = p.id AND pf.framework_id = 3 );
也可以用多表连接(需注意去重,避免因一对多关系导致重复计数):
SELECT COUNT(DISTINCT p.id) AS count_both FROM projects p JOIN project_skills ps ON p.id = ps.project_id JOIN project_frameworks pf ON p.id = pf.project_id WHERE ps.skill_id = 7 AND pf.framework_id = 3;
需求2:同时展示两个独立统计结果(分别显示两类项目的数量)
如果需要将「拥有skill_id=7的项目数」和「拥有framework_id=3的项目数」放在同一条结果展示:
SELECT (SELECT COUNT(DISTINCT project_id) FROM project_skills WHERE skill_id = 7) AS skill_7_count, (SELECT COUNT(DISTINCT project_id) FROM project_frameworks WHERE framework_id = 3) AS framework_3_count;
如果需要分两行展示:
SELECT 'skill_id=7' AS category, COUNT(DISTINCT project_id) AS project_count FROM project_skills WHERE skill_id = 7 UNION ALL SELECT 'framework_id=3' AS category, COUNT(DISTINCT project_id) AS project_count FROM project_frameworks WHERE framework_id = 3;
内容的提问来源于stack exchange,提问作者HeppokoNeet
相关产品推荐
相关产品推荐

