检查一列是否包含另一列的所有值 - 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));