2013-05-16 103 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