让两个人都在一起

时间:2013-11-12 17:49:24

标签: sql postgresql relational-division

我有一个问题我不知道怎么问对,所以我从SQL语句(Postgres)开始:

SELECT pc.person_id
  FROM groups g
  LEFT OUTER JOIN group_clubs gc ON (gc.group_id = g.id)
  LEFT OUTER JOIN person_club pc ON (gc.club_id = pc.club_id)
 WHERE g.id = 2

我拥有的: 一个团体,有一个俱乐部的标准,一个用户必须在。 这被分为groups表,group_clubs表和person_club

我想要的: 我想让所有俱乐部的所有人都与这个团体有联系。 我得到了什么: 我得到所有在至少一个俱乐部中的人。

我陷入困境并且不知道,如何得到结果,只有我需要交叉结果,但我现在不知道该怎么做......?!?

修改 为了解释我在寻找什么,这里有一个相同的声明:

SELECT pc.person_id
  FROM person_club pc
 WHERE pc.club_id IN (
    SELECT gc.club_id
      FROM group_clubs gc
      WHERE gc.group_id = 2
 );

我想要的是:

SELECT pc.person_id
  FROM person_club pc
 WHERE pc.club_id IN ALL(
     SELECT gc.club_id
       FROM group_clubs gc
      WHERE gc.group_id = 2
);

此人应该全部本声明所列的group_club!

2 个答案:

答案 0 :(得分:0)

试试这个:

SELECT pc.person_id
  FROM groups g
  INNER JOIN group_clubs gc ON (gc.group_id = g.id)
  INNER JOIN person_club pc ON (gc.club_id = pc.club_id)
 WHERE g.id = 2

我认为您不需要最后一行(WHERE子句),除非您想要检索一个人。

答案 1 :(得分:0)

感谢一位同事,我得到了答案:

SELECT pc.person_id
  FROM person_club_data pc
  INNER JOIN group_clubs gc ON (gc.club_id = pc.club_id)
 WHERE gc.group_id = 2
 GROUP BY pc.person_id
 HAVING COUNT(pc.person_id) >= (
     SELECT COUNT(gc.club_id)
       FROM group_clubs gc2
      WHERE gc2.group_id = 2
 )

我选择了这些人,并且可以在第2组找到与group_clubs行完全相同的人,并且他们与该组相关联。