簡體   English   中英

如何左加入一個表而不保留左表中的所有記錄?

[英]How to LEFT JOIN a table not keeping all the records from left table?

我有三張桌子:

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

例如:userid 48 ---> groupid 4897 ---> Dinnerid 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 48(groupid 4897)的 groupid,但我想要所有參與晚餐的 groupid(在這種情況下也是 groupid 5643)

如果我理解正確,您希望在其中一個具有請求的用戶時包含所有組。 如果是這樣,我認為您可以使用此方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM