2013-05-16 2 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, в результате чего :

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

Я пробовал некоторые запросы, но не представляю себе способ сделать это правильно.

ответ

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 секунд :) Если бы я мог, я бы добавил еще +1 для присоединения ANSI. –

+0

Я понял! Спасибо! –

1

Попробуйте использовать запрос INTERSECT. Синтаксис запроса SQL INTERSECT является:

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

Я не уверен, что мой синтаксис совершенен, но я рекомендовал бы самостоятельно присоединять user_group к себе, используя user_id и заставляя одну из выбранных записей (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 
Смежные вопросы