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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:05:25