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
相关产品推荐
相关产品推荐

