我有三个表:
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)
答案 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 = ?)