PostgreSQL查询用户列表并判断搜索者是否关注该用户
解决方案
你的SQL出现重复数据是因为LEFT JOIN的关联条件不完整——只限定了关注者ID,但没有将关注表的userToFollow与用户表的id关联,导致每个匹配的用户会和该关注者的所有关注记录进行关联,从而产生重复行。
要实现需求,你需要:
- 补全JOIN关联条件,确保用户表和关注表的关联关系正确
- 通过条件判断生成
isFollows布尔字段,标识当前用户是否关注该用户
以下是两种可行的修正方案:
方案一:补全LEFT JOIN关联条件
SELECT users.id, users.name, -- 通过CASE判断是否存在有效关注记录,生成布尔标识 CASE WHEN "user-follows"."userToFollow" IS NOT NULL THEN TRUE ELSE FALSE END AS isFollows FROM database.users LEFT JOIN database."user-follows" ON "user-follows"."userWhoIsFollowing" = 'BNvAn_' AND "user-follows"."userToFollow" = users.id -- 补全用户ID的关联逻辑 WHERE users."name" ILIKE '%olly%' ORDER BY users."updatedAt" DESC LIMIT 30;
方案二:使用EXISTS子查询(性能更优)
SELECT users.id, users.name, -- 直接通过子查询判断是否存在关注关系,返回布尔结果 EXISTS ( SELECT 1 FROM database."user-follows" WHERE "userWhoIsFollowing" = 'BNvAn_' AND "userToFollow" = users.id ) AS isFollows FROM database.users WHERE users."name" ILIKE '%olly%' ORDER BY users."updatedAt" DESC LIMIT 30;
关键说明
- 方案一通过补全LEFT JOIN的关联条件,确保每个用户仅与自己被当前用户关注的记录关联,从根源避免重复行;再通过CASE语句将存在的关注记录转为布尔标识。
- 方案二用EXISTS子查询直接检查当前用户对目标用户的关注状态,逻辑更直观,且无需JOIN操作,在数据量较大时性能表现更好。
内容的提问来源于stack exchange,提问作者Oliver Dixon
相关产品推荐
相关产品推荐

