You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL批量查询用户信息及与指定用户的关系

批量获取用户信息及双向关注关系的一次查询方案

嘿,这个需求完全可以通过一次SQL查询解决,不用给每个用户单独执行三次查询,既高效又简洁。下面是具体的实现思路和代码:

核心SQL语句

SELECT
  u.user_id,
  u.username,
  u.full_name,
  -- 标记当前登录用户(user_id=1)是否关注该用户
  CASE WHEN r1.relation_id IS NOT NULL THEN TRUE ELSE FALSE END AS i_follow_them,
  -- 标记该用户是否关注当前登录用户(user_id=1)
  CASE WHEN r2.relation_id IS NOT NULL THEN TRUE ELSE FALSE END AS they_follow_me
FROM users u
-- 关联关系表,查询登录用户关注该用户的记录
LEFT JOIN relations r1
  ON r1.user_id_1 = 1 AND r1.user_id_2 = u.user_id
-- 关联关系表,查询该用户关注登录用户的记录
LEFT JOIN relations r2
  ON r2.user_id_1 = u.user_id AND r2.user_id_2 = 1
-- 过滤出需要查询的目标用户列表
WHERE u.user_id IN (2, 3, 4);

代码解释

  • 主表查询:从users表中直接筛选出你指定的用户ID列表(这里是[2,3,4]),获取他们的基础信息。
  • 第一个LEFT JOIN:匹配relations表中「登录用户(user_id_1=1)作为关注者,目标用户作为被关注者」的记录。如果存在这条关系,i_follow_them字段就会返回TRUE,否则是FALSE。
  • 第二个LEFT JOIN:匹配relations表中「目标用户作为关注者,登录用户(user_id_2=1)作为被关注者」的记录。同理,they_follow_me字段会标记对方是否关注了登录用户。
  • 为什么用LEFT JOIN:确保即使某个用户和登录用户没有任何关注关系,也不会丢失该用户的基础信息,结果依然会返回该用户的记录,只是两个关系字段为FALSE。

性能优化建议

为了让这个查询更快,建议给relations表的user_id_1和user_id_2建立联合索引:

CREATE INDEX idx_relations_follower_followed ON relations(user_id_1, user_id_2);

这个索引会大幅提升两次关联查询的匹配速度,尤其是当relations表数据量较大时效果更明显。

内容的提问来源于stack exchange,提问作者Sam Leurs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:52:34