如何左联接表不保留左表中的所有记录?

时间:2020-06-08 17:18:15

标签: sql postgresql

我有三个表:

1-晚餐,包括晚餐详细信息

dinnerid | description | date
   1234
   5678
   9012

2-Dinners_detgroups,以及参加晚餐的组

dinnerid | groupid
1234       4897
1234       5643
5678       2398

3- groups_users,用户属于组

groupid | userid
4897      48
4897      97
5643      56
5643      43

我正在尝试查询返回包含所有正在寻找的用户ID的所有groupid的晚餐详细信息

例如:用户ID 48 --->组ID 4897 --->晚餐ID 1234

我希望查询返回正在参加的晚宴的详细信息,id为1234和groupid(在这种情况下为4897 5643)

我已经尝试过了

SELECT dinners.*, array_agg(dinners_detgroups.groupid) AS groupid 
FROM dinners 
  INNER JOIN dinners_detgroups ON dinners.dinnerid = dinners_detgroups.dinnerid 
  LEFT JOIN groups_users 
    ON dinners_detgroups.groupid = groups_users.groupid 
    AND groups_users.userid = ' + request.user.userid + ' 
GROUP BY dinners.dinnerid

但是将所有晚餐都退还给我,不仅是有48位用户的晚餐。

并以此

SELECT dinners.*, array_agg(dinners_detgroups.groupid) AS groupid 
FROM dinners 
  INNER JOIN dinners_detgroups ON dinners.dinnerid = dinners_detgroups.dinnerid 
  INNER JOIN groups_users 
          ON dinners_detgroups.groupid = groups_users.groupid 
         AND groups_users.userid = ' + request.user.userid + ' 
GROUP BY dinners.dinnerid

那将返回正确的晚餐,但是只有其中的组ID是用户ID 48(组ID 4897),但是我希望所有参加晚餐的组ID(在这种情况下,也是组ID 5643)

1 个答案:

答案 0 :(得分:0)

如果我的理解正确,那么当其中的一个具有请求的用户时,您希望包括 all 个组。如果是这样,我认为您可以使用此方法:

SELECT d.*, array_agg(DISTINCT dd.groupid) AS groupid
FROM dinners d INNER JOIN
     dinners_detgroups dd
     ON d.dinnerid = dd.dinnerid JOIN
     groups_users gu
     ON dd.groupid = gu.groupid 
GROUP BY d.dinnerid
HAVING bool_or(gu.userid = ?)