簡體   English   中英

使用聯接或子查詢選擇單個列

[英]Use a join or a subquery to select a single column

我正在編寫一個具有聊天功能的應用程序,並使用Postgres作為數據庫。 涉及4個表-用戶(保存用戶數據,包括其ID),組(保存組的列表,包括組ID),group_users(保存組ID與用戶ID的映射,從1到多個)和組聊天(保存映射)。到聊天室的用戶ID和文本本身)。 所有表之間都有明顯的外鍵。

我想獲取屬於給定groupid的groupchats中的所有行。 但是,我只希望這樣做的人在該組中。 我還想獲得每行交談的人的名字(記住該行存儲了用戶ID)。

以下是我想出的。 我很好奇的是,有沒有更好的辦法? 我正在使用子查詢來獲取當前行中用戶的名稱。 我應該使用聯接嗎? 另外,我相信我的第二個子查詢(針對exist子句)應該只運行一次,我是否正確? 還是我會在客戶端邏輯中做得更好(第二次往返數據庫)? 我會擴展數據庫可以對此進行優化。

SELECT userid, chat, time, 
      (SELECT firstname FROM users WHERE id=groupchat.userid) 
FROM groupchat 
WHERE groupid=$1 
  AND EXISTS (SELECT userid 
              from group_users 
              WHERE groupid=$1 AND userid=$2) 
ORDER BY time ASC;

您的方法很好。 您可以將其寫為顯式的JOIN 使用關聯也意味着您只需在查詢中包含一次$1即可:

SELECT gc.userid, gc.chat, gc.time, u.firstname
FROM groupchat gc JOIN
     users u
     ON u.id = gc.userid
WHERE gc.groupid = $1 AND
      EXISTS (SELECT 1 
              FROM group_users fu
              WHERE gu.groupid = gc.groupid AND gu.userid = $2
             ) 
ORDER BY gc.time ASC;

如果您有大量數據,則需要以下索引: groupchat(groupid, time)users(id, firstname)group_users(groupid, userid)

暫無
暫無

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

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