我有一张桌子上的人员名单。然后,我有另一个表格,我将每个人与一个或多个组相关联。有些人在群组表中只有一个条目,但有些人有多个条目。
我现在正在尝试选择两个特定组中的人员列表。为了符合资格,人必须在两个小组中。
我的表格中有关于人员的基本信息是基础,具有组关联的表格是groups_registration。事实上,我还有第三个表,其中存储了组名称和更多信息,但此查询不需要它。
我试图在这个例子中收集的组是4和11.
我最初尝试的是:
SELECT base.*, groups_registration.person_id, groups_registration.group_id
FROM base
INNER JOIN groups_registration
ON base.id = groups_registration.person_id
WHERE (groups_registration.group_id = '4' AND groups_registration.group_id = '11')
ORDER BY base.name
这没有得到我的任何回复,我假设因为没有一行包含group_id = 4和group_id 11.
我一直在搜索stackoverflow,没有任何乐趣。你们有什么想法吗?
答案 0 :(得分:1)
显然,没有行都有两个值。使用group by
:
SELECT gr.person_id, groups_registration.group_id
FROM groups_registration gr
WHERE gr.group_id IN (4, 11)
GROUP BY gr.person_id
HAVING COUNT(DISTINCT gr.group_id) = 2;
我们会让您弄清楚如何加入base
中的其他信息。
注意:
IN
优于OR
/ =
的长链。答案 1 :(得分:1)
您可以使用如下所示的联接:
SELECT A.*, B.person_id, B.group_id
FROM base A
INNER JOIN
(SELECT gr.person_id, groups_registration.group_id
FROM groups_registration gr
WHERE gr.group_id IN (4, 11)
GROUP BY gr.person_id
HAVING COUNT(DISTINCT gr.group_id) = 2) B
ON A.id = B.person_id;
这将为您提供所有需要的字段。