使用连接或子查询 select 单个列
Use a join or a subquery to select a single column
我正在编写一个具有聊天功能并使用 Postgres 作为数据库的应用程序。涉及 4 个表 - users(保存用户数据,包括他们的 id),groups(保存组列表,包括 groupid),group_users(保存 groupids 到 userids,1 到 many 的映射)和 groupchats (保存 groupid 到进入聊天的用户 id 和文本本身的映射)。所有表之间都有明显的外键。
我想获取群聊中属于给定组 ID 的所有行。但我只希望在请求它的人在该组中时这样做。我还想获取每一行说话人的姓名(记住该行存储用户 ID)。
以下是我的想法。我很好奇是否有更好的方法?我正在使用子查询来获取当前行中的用户名。我应该改用连接吗?另外,我相信我的第二个子查询(对于 exists 子句)应该只 运行 一次,我说得对吗?或者我会更好地处理客户端逻辑(对数据库进行第二次往返)?我想 expext 数据库可以对此进行优化。
SELECT userid, chat, time,
(SELECT firstname FROM users WHERE id=groupchat.userid)
FROM groupchat
WHERE groupid=
AND EXISTS (SELECT userid
from group_users
WHERE groupid= AND userid=)
ORDER BY time ASC;
你的方法很好。您可以将其写为显式 JOIN
。使用相关性还意味着您只需在查询中包含一次 </code>:</p>
<pre><code>SELECT gc.userid, gc.chat, gc.time, u.firstname
FROM groupchat gc JOIN
users u
ON u.id = gc.userid
WHERE gc.groupid = AND
EXISTS (SELECT 1
FROM group_users fu
WHERE gu.groupid = gc.groupid AND gu.userid =
)
ORDER BY gc.time ASC;
如果您有大量数据,那么您需要以下索引:groupchat(groupid, time)
、users(id, firstname)
和 group_users(groupid, userid)
。
我正在编写一个具有聊天功能并使用 Postgres 作为数据库的应用程序。涉及 4 个表 - users(保存用户数据,包括他们的 id),groups(保存组列表,包括 groupid),group_users(保存 groupids 到 userids,1 到 many 的映射)和 groupchats (保存 groupid 到进入聊天的用户 id 和文本本身的映射)。所有表之间都有明显的外键。
我想获取群聊中属于给定组 ID 的所有行。但我只希望在请求它的人在该组中时这样做。我还想获取每一行说话人的姓名(记住该行存储用户 ID)。
以下是我的想法。我很好奇是否有更好的方法?我正在使用子查询来获取当前行中的用户名。我应该改用连接吗?另外,我相信我的第二个子查询(对于 exists 子句)应该只 运行 一次,我说得对吗?或者我会更好地处理客户端逻辑(对数据库进行第二次往返)?我想 expext 数据库可以对此进行优化。
SELECT userid, chat, time,
(SELECT firstname FROM users WHERE id=groupchat.userid)
FROM groupchat
WHERE groupid=
AND EXISTS (SELECT userid
from group_users
WHERE groupid= AND userid=)
ORDER BY time ASC;
你的方法很好。您可以将其写为显式 JOIN
。使用相关性还意味着您只需在查询中包含一次 </code>:</p>
<pre><code>SELECT gc.userid, gc.chat, gc.time, u.firstname
FROM groupchat gc JOIN
users u
ON u.id = gc.userid
WHERE gc.groupid = AND
EXISTS (SELECT 1
FROM group_users fu
WHERE gu.groupid = gc.groupid AND gu.userid =
)
ORDER BY gc.time ASC;
如果您有大量数据,那么您需要以下索引:groupchat(groupid, time)
、users(id, firstname)
和 group_users(groupid, userid)
。