2016-11-08 204 views
0

我将给出一个我的意思的简单例子,但本质上,我想选择表中的所有条目,这些条目是该表的某些其他条目的适当子集。例如,这里是一个表如何使用MySQL查询合适的子集?

+----+---------------+------------+ 
| id | name   |department | 
+----+---------------+------------+ 
| 1 | John Smith |   1 | 
| 1 | John Smith |   2 | 
| 2 | Sally Thomas |   3 | 
| 2 | Sally Thomas |   4 | 
| 3 | Jimmy John |   1 | 
| 3 | Jimmy John |   2 | 
| 3 | Jimmy John |   3 | 
| 4 | Tom Roberts |   3 | 
| 4 | Tom Roberts |   4 | 
+----+---------------+------------+ 

从这张表中,我只想选择约翰史密斯。原因是因为John Smith工作的部门完全被Jimmy John工作的部门所控制。莎莉托马斯工作的部门与汤姆罗伯茨工作的部门完全相同,所以他们互不牵连。我正在使用this定义一个合适的子集。我怎么能写一个SQL语句来涵盖这个?谢谢!

回答

0

嗯。 。 。这似乎是一个自连接,但一个地方的计数可能会相当有用:

select t1.name, t2.name 
from t t1 join 
    t t2 
    on t1.department = t2.department join 
    (select name, count(*) as cnt 
     from t 
     group by name 
    ) t1name 
    on t1.name = t1name.name join 
    (select name, count(*) as cnt 
     from t 
     group by name 
    ) t2name 
    on t2.name = t2name.name 
group by t1.name, t2.name 
having count(*) = t2name.cnt and -- have everything in t2 
     t2name.cnt < t1name.cnt; -- strict subset 

嗯,一种方法是使用group_concat()

select t1.name, t2.name 
from t t1 join 
    t t2 
    on t1.department = t2.department 
group by t1.name, t2.name 
having group_concat(t2.department order by t2.department) = 
      (select group_concat(t.department order by t.department) 
      from t 
      where t.name = t2.department 
      ); 
0
SELECT a.name 
FROM (
    SELECT id,name,group_concat(dept) AS dept 
    FROM tab 
    GROUP BY id 
) AS a 
JOIN (
    SELECT id,name,group_concat(dept) AS dept 
    FROM tab 
    GROUP BY id 
) AS b ON b.dept LIKE concat(a.dept,',%') 

enter image description here