2013-05-16 77 views
1

的十字路口,我有三个表:联盟和数据

用户

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    | [..] 

那么现在,我能找到的所有用户从指定的组列表wi个工会,它就像一个“或”条款:

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组中的所有用户,结果导致:

​​

我已经尝试了一些查询,但不要想象一种正确的做法。

回答

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 

不一样干净正常的情况下,但它肯定可以的。

+0

+1 @schizodactyl - 打我大约10秒:)如果可以的话,我会为ANSI加入另一个+1。 –

+0

我懂了!谢谢! –

1

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

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

我不确定我的语法是否完美,但我建议使用user_id自加入user_group到自己,并强制其中一个选定的条目(ug1和ug2)使ug1.group_type_id = 1,另一个ug2.group_type_id = 3。这给你所有user_id的1和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