检查一列是否包含另一列的所有值 - Mysql
check if a column contains ALL the values of another column - Mysql
假设我有一个 table T1,其中包含人员 ID 和其他物品 ID,如下所示
Table: T1
personID | stuffID
1 | 1
1 | 2
1 | 3
1 | 4
2 | 1
2 | 4
3 | 1
3 | 2
还有另一个 table T2 只有一列 stuffIDs
Table: T2
stuffID
1
2
3
我通过 SELECT
得到的结果是 table 个与 T2 的所有 stuffID 相关联的 peopleID。
按照这个例子,结果将只有 id 1(personID 3 不会出现,即使它关联的所有 stuffID 都包含在 T2.stuffID 中)。
select personID from T1 group by personID having count(distinct stuffID) in (select count(distinct stuffID) from T2)
select count(distinct stuffID) from T2
<-- 将给出不同 countID 的总数
group by personID having count(distinct stuffID)
<-- 按 personId 分组后,计算 personId 拥有的 stuffIds 的数量。
所以两个计数应该相等才能得到想要的结果。
select personID
from T1
where stuffID in (select stuffID from t2)
group by personID
having count(distinct stuffID) = (select count(*) from t2)
即选择一个人在 T2 中的 stuffid,对它们进行计数(仅不同),并验证与 t2 中相同的数字。
试试这个
select personID from T1
group by personID
having count(distinct stuffID) >= (select count(*) from t2)
如果我没理解错的话,您想从 T1 中检索所有在 T2 中找到所有相关联的 stuffID 的 personID。
您可以将其分解如下:
首先,找到与嵌套查询匹配的所有 T1 条目
SELECT personID
FROM T1 WHERE stuffID IN (SELECT stuffID FROM t2)
现在您需要检查此集合中的哪些条目包含您想要的所有 stuffID
GROUP BY personID
HAVING COUNT(DISTINCT stuffID) = (SELECT COUNT(stuffID) FROM t2)
并将它们放在一起:
SELECT personID
FROM T1 WHERE stuffID IN (SELECT stuffID FROM t2)
GROUP BY personID
HAVING COUNT(DISTINCT stuffID) = (SELECT COUNT(stuffID) FROM t2)
HTH.
使用count
是一种有效的方法。另外,从集合论的角度,你可以这样想:对于一个有效的personID,我们不应该在T2中找到一个stuffID,但在T1中没有连接到这个personID。因此我们可以这样做:
SELECT DISTINCT T1.personID
FROM T1
WHERE NOT EXISTS (
SELECT T2.stuffID
FROM T2
WHERE T2.stuffID NOT IN (
SELECT DISTINCT T1copy.stuffID
FROM T1 T1copy
WHERE T1copy.personID=T1.personID));
假设我有一个 table T1,其中包含人员 ID 和其他物品 ID,如下所示
Table: T1
personID | stuffID
1 | 1
1 | 2
1 | 3
1 | 4
2 | 1
2 | 4
3 | 1
3 | 2
还有另一个 table T2 只有一列 stuffIDs
Table: T2
stuffID
1
2
3
我通过 SELECT
得到的结果是 table 个与 T2 的所有 stuffID 相关联的 peopleID。
按照这个例子,结果将只有 id 1(personID 3 不会出现,即使它关联的所有 stuffID 都包含在 T2.stuffID 中)。
select personID from T1 group by personID having count(distinct stuffID) in (select count(distinct stuffID) from T2)
select count(distinct stuffID) from T2
<-- 将给出不同 countID 的总数
group by personID having count(distinct stuffID)
<-- 按 personId 分组后,计算 personId 拥有的 stuffIds 的数量。
所以两个计数应该相等才能得到想要的结果。
select personID
from T1
where stuffID in (select stuffID from t2)
group by personID
having count(distinct stuffID) = (select count(*) from t2)
即选择一个人在 T2 中的 stuffid,对它们进行计数(仅不同),并验证与 t2 中相同的数字。
试试这个
select personID from T1
group by personID
having count(distinct stuffID) >= (select count(*) from t2)
如果我没理解错的话,您想从 T1 中检索所有在 T2 中找到所有相关联的 stuffID 的 personID。
您可以将其分解如下: 首先,找到与嵌套查询匹配的所有 T1 条目
SELECT personID
FROM T1 WHERE stuffID IN (SELECT stuffID FROM t2)
现在您需要检查此集合中的哪些条目包含您想要的所有 stuffID
GROUP BY personID
HAVING COUNT(DISTINCT stuffID) = (SELECT COUNT(stuffID) FROM t2)
并将它们放在一起:
SELECT personID
FROM T1 WHERE stuffID IN (SELECT stuffID FROM t2)
GROUP BY personID
HAVING COUNT(DISTINCT stuffID) = (SELECT COUNT(stuffID) FROM t2)
HTH.
使用count
是一种有效的方法。另外,从集合论的角度,你可以这样想:对于一个有效的personID,我们不应该在T2中找到一个stuffID,但在T1中没有连接到这个personID。因此我们可以这样做:
SELECT DISTINCT T1.personID
FROM T1
WHERE NOT EXISTS (
SELECT T2.stuffID
FROM T2
WHERE T2.stuffID NOT IN (
SELECT DISTINCT T1copy.stuffID
FROM T1 T1copy
WHERE T1copy.personID=T1.personID));