检查列是否包含另一列的所有值 - Mysql

时间:2015-03-09 10:08:06

标签: mysql sql relational-division

假设我有一个带有人员ID和其他东西ID的表格T1,如下所示

Table: T1
personID | stuffID 
    1    |    1
    1    |    2
    1    |    3
    1    |    4
    2    |    1
    2    |    4
    3    |    1
    3    |    2

另一个表T2只有一列stuffID

Table: T2
stuffID
   1  
   2  
   3  

我得到的结果是SELECT,是一个与所有T2的所有stuffID连接的peopleID表。

在示例之后,结果将只是id 1(即使所有关联的所有stuffID都包含在T2.stuffID中,personID 3也不会出现。)

5 个答案:

答案 0 :(得分:3)

如果我理解正确,你想从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。

答案 1 :(得分:2)

select personID
from T1
where stuffID in (select stuffID from t2)
group by personID
having count(distinct stuffID) = (select count(*) from t2)

选择一个人在T2中的填充物,计算它们(仅限于区别),并验证与t2中相同的数字。

答案 2 :(得分:0)

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拥有的stuffId数。

因此两个计数应该等于得到所需的结果。

答案 3 :(得分:0)

使用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));

答案 4 :(得分:-1)

试试这个

    select personID from T1
    group by personID
    having count(distinct stuffID) >= (select count(*) from t2)