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

mwyxok5s  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(316)

我有三张table:
1-晚餐,含晚餐详情

dinnerid | description | date
   1234
   5678
   9012

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

dinnerid | groupid
1234       4897
1234       5643
5678       2398

3-将用户分组,其中用户是组的一部分

groupid | userid
4897      48
4897      97
5643      56
5643      43

我正在尝试进行一个查询,返回所有groupid参与的晚餐的详细信息,其中有我要查找的userid
例如:userid 48--->groupid 4897--->dinnerid1234
我希望查询返回id为1234的晚餐的详细信息和参与的groupid(在本例中为48975643)
我试过了

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为48(groupid 4897)的groupid,但我需要所有参与晚餐的groupid(在本例中也是groupid 5643)

acruukt9

acruukt91#

如果我理解正确,您希望在其中一个组具有请求的用户时包含所有组。如果是这样,我想你可以用这个方法:

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 = ?)

相关问题