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

PostgreSQL查询优化:单语句实现用户是否在关注列表的判断

单条SQL实现用户关注状态标记

当然可以用单条SQL语句高效实现需求,无需在应用层做三次查询和遍历。下面基于常见的表结构假设(你可以根据实际字段调整)给出两种实现方式:

方法1:LEFT JOIN + CASE 语句

假设表结构:

  • 表A(所有用户列表):users,包含user_id(主键)、username等用户字段
  • 表B(关注列表):user_follows,包含follower_id(当前用户ID)、followed_user_id(被关注用户ID)
SELECT
    a.user_id,
    a.username,
    -- 标记当前用户是否关注该用户
    CASE WHEN b.followed_user_id IS NOT NULL THEN TRUE ELSE FALSE END AS is_followed
FROM
    users a
LEFT JOIN
    user_follows b 
    ON a.user_id = b.followed_user_id 
    AND b.follower_id = '你的当前用户ID' -- 替换为实际的当前登录用户ID
WHERE
    -- 这里添加表A的过滤条件,比如筛选活跃用户
    a.is_active = TRUE;

原理:通过LEFT JOIN保留表A所有符合过滤条件的记录,当表B中存在当前用户关注该用户的匹配记录时,b.followed_user_id不为空,标记为TRUE,否则为FALSE。

方法2:EXISTS 子查询

如果表B的follower_id和followed_user_id有联合索引,这种方法的性能可能更优:

SELECT
    a.user_id,
    a.username,
    -- 直接通过子查询判断是否存在关注关系
    EXISTS (
        SELECT 1
        FROM user_follows b
        WHERE b.followed_user_id = a.user_id
          AND b.follower_id = '你的当前用户ID'
    ) AS is_followed
FROM
    users a
WHERE
    -- 添加表A的过滤条件
    a.is_active = TRUE;

原理:EXISTS会检查子查询是否存在匹配的关注记录,返回布尔值直接作为is_followed字段,数据库会自动优化这个子查询的执行效率。

为什么更高效?

把判断逻辑交给数据库处理,避免了应用层多次查询和遍历的开销,同时数据库可以利用索引(比如给user_follows的(follower_id, followed_user_id)建联合索引)大幅提升查询速度,减少数据传输量。

内容的提问来源于stack exchange,提问作者charlotte Coupez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:45:30