如何解决以更有效的方式从PostgreSQL数据库检索数据
我正在使用PostgreSQL开发一个实时聊天应用程序,并且遇到以下问题:
当用户登录时,我需要获取不是登录用户的所有用户,以便将其显示在应用程序的侧边栏中。
应该在每个用户下方显示由登录用户或其他用户发送的最新消息。
我正在尝试执行高效的查询,以便一次检索所有具有最新消息的用户,但没有成功。
以下是我的表格:
我最初尝试做类似的事情:
SELECT users.id,users.first_name,users.last_name,users.image,messages.sender_id,messages.recipient_id,messages.content
FROM users LEFT JOIN messages on users.id = messages.sender_id OR users.id = messages.recipient_id
WHERE (messages.sender_id = 1 OR messages.recipient_id = 1) AND users.id != 1
GROUP BY users.id
ORDER BY messages.created_at DESC;
我得到了这个错误:
- “ 1”是指登录的用户ID
我的临时解决方案是从数据库中获取所有用户,在服务器上映射它们,然后执行另一个查询,该查询使用-ORDER BY created_at DESC LIMIT 1在用户之间发送最新消息。
我敢肯定还有更有效的方法,我将不胜感激!
解决方法
如果我正确地遵循了您的说明,则可以使用条件逻辑来选择已登录用户与任何其他用户之间交换(发送或接收)的消息,然后选择联接以带来相应的用户记录。为了获得每个用户的最新消息,distinct on
在Postgres中很方便。
考虑:
select distinct on (u.id) u.id,... -- enumerate the columns you want here
from (
select m.*,case when sender_id = 1 then recipient_id else sender_id end as other_user_id
from messages m
where 1 in (m.sender_id,m.recipient_id)
) m
inner join users u on u.id = m.other_user_id
order by u.id,m.created_at desc
我们也可以使用横向连接来表达这一点:
select distinct on (u.id) u.id,...
from messages m
cross join lateral (values
(case when sender_id = 1 then recipient_id else sender_id end as other_user_id)
) as x(other_user_id)
inner join users u on u.id = x.other_user_id
where 1 in (m.sender_id,m.recipient_id)
order by u.id,m.created_at desc
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。