我再次发布这个问题,因为我觉得我上次可能措辞不好,而且我认为解决方案有效,但不是。
我有3个表:项目,服务和建议。建议提供了项目和服务之间的多对多关系,即Recommendations中的每一行都有一个project_id和一个service_id。
假设有1000个项目和5个服务。我预计我的Recommendations表中不会有超过5000条记录,但几乎可以肯定更少(即某些项目没有服务建议)。因此,对于项目#1,如果建议使用所有5个服务,我会在Recommendations表中看到5行,如:
project_id service_id
1 1
1 2
1 3
1 4
1 5
我想要做的是构建一个查询,向我展示哪些项目没有推荐所有5项服务,以及这些服务。因此,假设项目#1仅推荐了前3项服务;我的查询输出显示哪些缺失可能如下所示:
project_id service_id
1 4
1 5
谢谢!
答案 0 :(得分:5)
Select P.project_id, S.service_id
From Projects As P
Cross Join Services As S
Where Not Exists (
Select 1
From Recommendations As R1
Where R1.project_id = P.project_id
And R1.service_id = S.service_id
)
另一个应该在MySQL中起作用的变种
Select P.project_id, S.service_id
From Projects As P
Cross Join Services As S
Where (P.project_id, S.service_id) Not In (
Select R1.project_Id, R1.service_id
From Recommendations As R1
)
答案 1 :(得分:2)
现在更新,我正确地阅读了这个问题。我仍然会使用外连接,但这次没有子查询:
SELECT p.project_id,s.service_id
FROM projects p
cross join services s
LEFT OUTER JOIN recommendations r on r.project_id = p.project_id and r.service_id = s.service_id
WHERE r.project_id IS NULL
答案 2 :(得分:1)
一个相当简单的选择是:
select project_id, count(*)
from recommendations
group by project_id
having count(distinct service_id) < (select count(*) from services)