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

PostgreSQL查询用户列表并判断搜索者是否关注该用户

解决方案

你的SQL出现重复数据是因为LEFT JOIN的关联条件不完整——只限定了关注者ID,但没有将关注表的userToFollow与用户表的id关联,导致每个匹配的用户会和该关注者的所有关注记录进行关联,从而产生重复行。

要实现需求,你需要:

  1. 补全JOIN关联条件,确保用户表和关注表的关联关系正确
  2. 通过条件判断生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:50:39