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

