2016-11-08 215 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