我的数据库中有以下表格:
people_to_groups
id | personID | groupID
-------------------------
1 | 5 | 2
-------------------------
2 | 6 | 2
-------------------------
3 | 7 | 3
-------------------------
4 | 5 | 3
-------------------------
5 | 5 | 4
-------------------------
6 | 5 | 7
-------------------------
7 | 6 | 7
我正在尝试找出一个返回每个groupID
的查询,其中只包含两个personID
5和6而不包含其他personID
。
因此,如果查询在上表中运行,它将返回以下结果集:
groupID
-------
2
-------
7
因为第2组和第7组是唯一同时拥有5人和6人且没有其他人的人。
(PS,如果有人能想到更好的标题,请建议编辑)
答案 0 :(得分:3)
要确保groupid同时具有5和6,您可以使用以下三个规则:
1 - Max是6
2 - Min是5
3 - 不同人数为2
SELECT groupID
FROM people_to_groups
GROUP BY groupID
HAVING MAX(personID) = 6
AND MIN(personID) = 5
AND COUNT(DISTINCT personID) = 2;
答案 1 :(得分:1)
answer by Vashi很酷,但您只能在选择组连续时使用它(例如5& 6或5& 6& 7,而不是5& 8)。为了涵盖所有情况,您可以直接使用要求的翻译:
SELECT DISTINCT groupID
FROM people_to_groups
WHERE personID = 5
AND groupID IN (SELECT groupID
FROM people_to_groups
WHERE personID = 6)
AND groupID NOT IN (SELECT groupID
FROM people_to_groups
WHERE personID NOT IN (6 , 5));
这很容易理解,选择所有组为5,为6添加组,最后删除其他组的所有组。
或者,如果你喜欢Vashi答案中的分组想法,你可以修改它以涵盖所有情况:
SELECT groupID
FROM people_to_groups
WHERE personID IN (6 , 5)
AND groupID NOT IN (SELECT groupID
FROM people_to_groups
WHERE personID NOT IN (6 , 5))
GROUP BY groupID
HAVING COUNT(DISTINCT personID) = 2;
所以同样的想法,我们正在寻找只有2个不同数字的群体,我们将这两个数字定义为5&这里唯一的区别是,而不是定义5& 6作为范围(即min = 5和max = 6),我们实际上将搜索限制为5& 6。 6然后删除所有其他数字。
使用两种解决方案中的哪一种取决于具体情况。第一个是直截了当且易于理解的,但如果你在选择组中有几个数字(例如5& 6& 8& 10),那么你最终会得到许多子查询。在这种情况下,第二个解决方案将更易于管理,因为它将保持不变,您只需在IN()
和NOT IN()
部分添加所需的所有数字。