如何通过单条SQL查询同时获取关注用户帖子和热门补充帖子?
实现方案
可以通过UNION ALL拼接两个结果集,再加优先级标识排序的方式实现单条SQL完成需求,具体语句如下:
SELECT * FROM ( -- 第一部分:取关注用户的最新帖子,优先级设为1 SELECT *, 1 AS priority FROM posts WHERE author_id IN ( SELECT followedID FROM follows WHERE followerID = :myID ) ORDER BY id DESC LIMIT 10 UNION ALL -- 第二部分:取非关注用户的热门帖子,优先级设为2,排除已关注用户避免内容重复 SELECT *, 2 AS priority FROM posts WHERE author_id NOT IN ( SELECT followedID FROM follows WHERE followerID = :myID ) ORDER BY post_likes DESC LIMIT 10 ) AS combined_posts -- 全局排序保证优先级高的内容在前 ORDER BY priority ASC, -- 同优先级下按对应规则排序:关注帖按发布时间倒序,热门帖按点赞倒序 CASE WHEN priority = 1 THEN id END DESC, CASE WHEN priority = 2 THEN post_likes END DESC -- 最终取满10条 LIMIT 10;
逻辑说明
- 内层两个查询分别提前取出最多10条关注帖、10条热门帖作为备用,避免全表扫描性能损耗
- 优先级标识保证关注帖永远排在热门帖前面,若关注帖不足10条,缺口会自动用后续的热门帖补齐
- 新增的
author_id NOT IN过滤条件,避免同一个帖子重复出现在结果集中
如果需要热门帖在点赞数接近时随机展示,只需要把第二部分的排序规则改为ORDER BY post_likes DESC, RAND()即可。
内容的提问来源于stack exchange,提问作者Jihane Elberouhi
相关产品推荐
相关产品推荐

