联合和数据的交集

时间:2013-05-16 14:46:05

标签: mysql algorithm intersection

我有三张桌子:

用户

id | name
------------------
1  | Foo
2  | Bar
3  | Baz

group_type

id | name
------------------
1  | Group 1
2  | Group 2
3  | Group 3
4  | Group 4
5  | Group 5

USER_GROUP

id | user_id | group_type_id | [..]
------------------------------------
1  | 1       | 1             | [..]
2  | 1       | 3             | [..]
3  | 2       | 1             | [..]
4  | 1       | 5             | [..]
5  | 2       | 3             | [..]
6  | 3       | 3             | [..]

那么,目前,我可以找到具有union的指定组列表中的所有用户,这类似于“或”子句:

SELECT u.*
FROM   user u,
       user_group ug
WHERE  ug.user_id = u.id
       AND ug.group_type_id IN( 1, 3, 5 )  

由于:

id | name
------------------
1  | Foo
2  | Bar
3  | Baz

现在,我需要与gorup相交,找到所有具有类型1和3的组的用户,结果:

id | name
------------------
1  | Foo
2  | Bar

我尝试了一些查询,但没有想象出一种正确的方法。

3 个答案:

答案 0 :(得分:3)

SELECT u.id, u.name
FROM user u 
INNER JOIN user_group g 
  ON u.id = g.user_id 
WHERE ug.group_type_id IN (1,3) 
GROUP BY u.id, u.name 
HAVING count(distinct ug.group_type_id) = 2 

不像正常情况那样干净,但肯定是可能的。

答案 1 :(得分:1)

尝试使用INTERSECT查询。 SQL INTERSECT查询的语法是:

select field1, field2, ... field_n
from tabl,tab2...
INTERSECT
select field1, field2, ... field_n
from tablel,table2...

答案 2 :(得分:0)

我不确定我的语法是否完美,但我建议使用user_id自我加入user_group并强制其中一个选定的条目(ug1和ug2)拥有ug1.group_type_id = 1而另一个ug2 .group_type_id = 3。这将为您提供所有user_id,其中包含1 AND 3作为其group_type_id。现在您已经拥有了这个,您可以在用户表上进行另一次加入,为您提供所需的所有结果。

SELECT u.* 
FROM user u 
JOIN (SELECT ug1.user_id 
    FROM user_group ug1 JOIN user_group ug2 
    ON ug1.user_id=ug2.user_id
    WHERE ug1.group_type_id=1 and ug2.group_type_id=3) ug
ON u.id=ug.user_id