MySQL 独占联接,一列有多个值

标签 mysql database relational-database

我在 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/

相关文章:

php - 带PHP和Mysql的收件箱和发件箱系统

mysql - Esqueleto 位于实体 ID 上

Yii:如何用另一个模型数据填充 Select 输入?

database - 候选键有什么意义?

mysql - 为什么要在所需的数据库列上设置 `null: false, default: ""`?

mysql - mysql 中的记录具有重复的 id(状况良好)?任何查询得到

php - 我应该使用什么值? (根据该变量选择是否显示表数据)

java - MongoDB 查询来自 Java 驱动程序的分页

java - 在 hibernate 状态下从集合中删除实体

sql - 数据库,其他语言的列名