MySQL:多对多加入不存在的地方

时间:2011-03-15 19:57:39

标签: php mysql sql

我再次发布这个问题,因为我觉得我上次可能措辞不好,而且我认为解决方案有效,但不是。

我有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

谢谢!

3 个答案:

答案 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)