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 keyunique 约束来确保),并且 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,则可以单独使用内联视图。