查询只有特定ID且没有其他ID的记录共享的公共列?

时间:2017-12-30 01:30:11

标签: mysql sql

我的数据库中有以下表格:

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,如果有人能想到更好的标题,请建议编辑)

2 个答案:

答案 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()部分添加所需的所有数字。