我有三张桌子:
用户
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
我尝试了一些查询,但没有想象出一种正确的方法。
答案 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