mysql - 如何使用 where 条件选择资源,强制在连接表中具有两个关系

标签 mysql

如何使用 where 条件选择资源,强制在连接表中具有两个关系。

例如,假设我必须有表 resourceitem,其中一个资源可以拥有多个项目,并且项目可以分配给多个资源。

现在我需要选择一个有两个特定项目的资源?如何以最简单的方式做到这一点?

SELECT
      r.name,
      GROUP_CONCAT(DISTINCT CONCAT(i.name))  AS itemNames
    FROM
        resources r
      LEFT JOIN resources_items ri ON ri.resourceId = r.id
      LEFT JOIN items i ON i.id = ri.itemId
      WHERE i.id= '1' AND i.id = '2'
GROUP BY r.id

这是一个好的方向吗?

后来我想根据许多项目选择许多资源。例如,在给定数组中具有 id 或具有 id 1 或 2 的项目的所有资源

最佳答案

另一种方法是使用 IN()COUNT()

SELECT
  r.name,
  GROUP_CONCAT(DISTINCT CONCAT(i.name))  AS itemNames
FROM
    resources r
  LEFT JOIN resources_items ri ON ri.resourceId = r.id
  LEFT JOIN items i ON i.id = ri.itemId
WHERE i.id IN(1,2)
GROUP BY r.id
HAVING COUNT(DISTINCT i.id) = 2

对于更多元素,您只需更新 IN 并且计数需要等于给定数组的长度

这种方法是 mysql 特定的,它将使用 sum() 使每个过滤器都为 true

SELECT
  r.name,
  GROUP_CONCAT(DISTINCT CONCAT(i.name))  AS itemNames
FROM
    resources r
  LEFT JOIN resources_items ri ON ri.resourceId = r.id
  LEFT JOIN items i ON i.id = ri.itemId
WHERE i.id IN(1,2)
GROUP BY r.id
HAVING SUM(i.id = 1)  > 1
AND SUM(i.id = 2)  > 1

并根据您的输入项重复此 SUM(i.id = @itemInput) 子句,以便与第一种方法相比,这也是一个像您一样复杂的方法,其中不涉及任何内容。条件或没有。连接数。而在第一种方法中,您只需要计算您的输入并匹配having子句

关于mysql - 如何使用 where 条件选择资源,强制在连接表中具有两个关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47811847/

相关文章:

php - Jquery 填充选择列表

php - SQL 错误(更新 gegevens)::'1' 中的未知列 'field list'

mysql - 如何在终端中最好地显示返回太多字段的 MySQL SELECT?

php - Symfony2 将父实体 ID 设置为关系表

php - Openshift 上的 MYSQL 5.1 上的错误 2003

html - 来自远程系统的实时可视化(OutSide LAN)

PHP - 等待 2 小时执行查询

mysql - 使用服务器端准备好的语句进行子查询?

mysql - 根据其他字段的内容生成唯一的 MySQL 字段

php - 如何在整个 MySQL 数据库中搜索某个字符串?