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_ID
1和USER_ID
2都有ASSET_ID
=2的记录,所以这个WHERE
子句将包括这两行。
WHERE ASSET_ID = 1 AND ASSET_ID = 2
将失败,因为 ASSET_ID
.
没有包含 1 和 2 的单行
我认为您要问的是如何检索包含一组 ASSET_ID
的 USER_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)
是唯一键
,则不需要区分
给出下面的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_ID
1和USER_ID
2都有ASSET_ID
=2的记录,所以这个WHERE
子句将包括这两行。
WHERE ASSET_ID = 1 AND ASSET_ID = 2
将失败,因为 ASSET_ID
.
我认为您要问的是如何检索包含一组 ASSET_ID
的 USER_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)
是唯一键