MySQL:查询行的子集

时间:2015-05-25 02:47:46

标签: mysql subset

列出下表:

表:USER_ASSETS

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

如果我搜索USER_ID ASSET_ID等于1和2,它应该返回USER_ID 1,因为USER_ID 1有ASSET_ID&#39 ; s 1和2。

如果我通过ASSET_ID = 1和2和4,它应该返回0行,因为没有USER_IDASSET_ID 1,2和4。

如果我通过ASSET_ID 2和3,则应返回USER_ID 1和2,因为这两个USER_ID都有ASSET_ID 2和3 < / p>

我现在卡住了,因为我无法找到正确的查询结果。

我试过这个:

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

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

我也尝试过:

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

但是这总是返回0行,因为WHERE子句一次只执行一行。

2 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

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)是一个唯一的密钥

,则必须具备明确的要求

答案 1 :(得分:1)

WHERE ASSET_ID IN (1, 2)WHERE ASSET_ID = 1 OR ASSET_ID = 2相同,USER_ID 1和USER_ID 2都有ASSET_ID = 2的记录,因此{{1} }子句将包括这两行。

WHERE将失败,因为WHERE ASSET_ID = 1 AND ASSET_ID = 2没有单行同时包含1和2。

我认为您要问的是如何检索具有ASSET_ID个全部集合的USER_ID。在这种情况下,您需要构建一个更复杂的查询:

ASSET_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 1和USER_ID的所有ASSET_ID值.2。您可以添加尽可能多的ASSET_ID条款和其他INNER JOIN条件您需要的An.ASSET_ID子句。