我在 MySQL 中有以下结构:
business
-------------
id
name
service
-------------
id
name
business_service
-----------------
business_id
service_id
我想选择不具有一项而是具有所有指定服务的企业。如果我做这样的事情:
SELECT * FROM business LEFT JOIN business_service ON business_service.business_id = business.id WHERE business_service.service_id IN (1,2,3)
它将返回具有服务 1、2 或 3 的业务。我想检索具有这三个服务的业务。
有什么想法吗?
谢谢!
最佳答案
假设表business_service
没有重复行(您可以并且应该通过主键
或唯一
约束来确保这一点),并且business_service.service_id
永远不会采用 null
值(您也应该通过约束强制执行),您可以像这样解决问题:
select b.id, b.name
from (
select business_id
from business_service
group by business_id
having count(*) = (select count(*) from service)
) bs
join business b
on b.id = bs.business_id
如果您想识别那些仅拥有特定服务子集的企业,那么您可以采取类似的方法:
select b.id, b.name
from (
select business_id
from business_service
where service_id in (1, 2, 3)
group by business_id
having count(*) = 3
) bs
join business b
on b.id = bs.business_id
在每种情况下,内联 View 都会识别那些具有预期服务数量的企业(按 ID)——与第一种情况下的表 service
总体服务数量相同,或者是第二种情况下过滤器中的服务 ID。主查询只是将其连接到表 business
中,以将企业名称与这些 ID 相关联。如果您只需要业务 ID,则可以单独使用内联 View 来实现此目的。
关于MySQL 独占联接,一列有多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29881325/