MySQL:查询行的子集

MySQL: Query a subset of rows

给出下面的table:

TABLE : USER_ASSETS

USER_ID | ASSET_ID
-------------------
1       |  1
-------------------
1       |  2
-------------------
1       |  3
-------------------
2       |  2
-------------------
2       |  3
-------------------

如果我搜索 ASSET_ID 等于 1 和 2 的 USER_ID,它应该 return USER_ID 1 因为 USER_ID 1 有 ASSET_ID 的 1 和 2.

如果我传递 ASSET_ID = 1 和 2 和 4,它应该 return 0 行,因为没有 USER_ID 具有 ASSET_ID 1、2和 4.

如果我传递 ASSET_ID 2 和 3 它应该 return USER_ID 1 和 2 因为这两个 USER_ID 都有 ASSET_ID 2 和3.

我现在被卡住了,因为我找不到我想要的结果的正确查询。

我试过这个:

SELECT DISTINCT ID FROM USER_ASSETS WHERE ASSET_ID IN (1, 2);

但是结果是错误的,因为它 return 是 USER_ID 1 和 2。

我也试过:

SELECT DISTINCT ID FROM USER_ASSETS WHERE ASSET_ID = 1 AND ASSET_ID = 2

但这总是 return 到 0 行,因为 WHERE 子句一次只对一行执行。

WHERE ASSET_ID IN (1, 2)WHERE ASSET_ID = 1 OR ASSET_ID = 2一样,USER_ID1和USER_ID2都有ASSET_ID=2的记录,所以这个WHERE 子句将包括这两行。

WHERE ASSET_ID = 1 AND ASSET_ID = 2 将失败,因为 ASSET_ID.

没有包含 1 和 2 的单行

我认为您要问的是如何检索包含一组 ASSET_IDUSER_ID。在这种情况下,您需要构建更复杂的查询:

SELECT A1.USER_ID 
FROM USER_ASSETS AS A1 
INNER JOIN USER_ASSETS AS A2
ON A1.USER_ID = A2.USER_ID
WHERE A1.ASSET_ID = 1 AND A2.ASSET_ID = 2

这将 return 具有 ASSET_ID 1 和 ASSET_ID 2 的所有 USER_ID 值。您可以添加尽可能多的 INNER JOIN 子句和额外的 An.ASSET_ID 条件添加到 WHERE 子句中。

您可以尝试这样的操作:

select user_id
  from user_assets
  where asset_id = 1 or asset_id = 2 ...
  group by user_id
  having count(distinct asset_id) = (number of assets you are looking for)

demo here 显示您需要的输出。

如果 (user_id, asset_id) 是唯一键

,则不需要区分