[英]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.