我在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的业务。我想要检索具有这三个服务的业务。
有什么想法吗?
谢谢!
答案 0 :(得分:1)
假设表格business_service
没有重复的行(您可以并且应该通过primary key
或unique
约束确保这一行),并且business_service.service_id
从不采用{{ 1}}值(您也应该通过约束强制执行),您可以像这样处理问题:
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
在每种情况下,内联视图都标识具有预期服务数量的那些业务(按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
相同的服务数,或者服务ID的数量。第二种情况下的过滤器。主查询只是将其连接到表service
以将业务名称与这些ID相关联。如果您只需要业务ID,那么内联视图可以单独用于此目的。