如何在连接表中选择具有两个关系的条件的资源

时间:2017-12-14 11:07:59

标签: mysql

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

例如,假设我必须使用表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

的项的所有资源

1 个答案:

答案 0 :(得分:0)

另一种方法是使用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()使每个过滤器像

一样真实
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)子句,以便与第一种方法进行比较,这也是一个复杂的方法,例如您将不涉及。条件或否。连接在第一种方法中,你只需要计算你的输入并匹配有条款