MySQL 一列有多个值的排他 JOIN
MySQL Exclusive JOIN with multiple values for one column
我在MySQL中有以下结构:
business
-------------
id
name
service
-------------
id
name
business_service
-----------------
business_id
service_id
我想select没有一个但所有指定服务的企业。如果我这样做:
SELECT * FROM business LEFT JOIN business_service ON business_service.business_id = business.id WHERE business_service.service_id IN (1,2,3)
它将 return 具有服务 1、2 或 3 的业务。我想检索具有这三个业务的业务。
有什么想法吗?
谢谢!
假设 table business_service
没有重复行(您可以并且应该通过 primary key
或 unique
约束来确保),并且 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
在每种情况下,内嵌视图(按 ID)识别具有预期服务数量的企业——在第一种情况下,服务数量与 table service
总体相同,或者第二种情况下过滤器中服务 ID 的数量。主查询只是将其连接到 table business
以将企业名称与这些 ID 相关联。如果您只需要业务 ID,则可以单独使用内联视图。
我在MySQL中有以下结构:
business
-------------
id
name
service
-------------
id
name
business_service
-----------------
business_id
service_id
我想select没有一个但所有指定服务的企业。如果我这样做:
SELECT * FROM business LEFT JOIN business_service ON business_service.business_id = business.id WHERE business_service.service_id IN (1,2,3)
它将 return 具有服务 1、2 或 3 的业务。我想检索具有这三个业务的业务。
有什么想法吗?
谢谢!
假设 table business_service
没有重复行(您可以并且应该通过 primary key
或 unique
约束来确保),并且 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
在每种情况下,内嵌视图(按 ID)识别具有预期服务数量的企业——在第一种情况下,服务数量与 table service
总体相同,或者第二种情况下过滤器中服务 ID 的数量。主查询只是将其连接到 table business
以将企业名称与这些 ID 相关联。如果您只需要业务 ID,则可以单独使用内联视图。