如何编写SQL查询获取当前用户关注用户发布的帖子?
解决方案:获取关注用户的帖子信息流
一、原生SQL实现
你已经能查到当前用户关注的用户列表,只需将这个结果和posts表关联,就能拿到这些用户发布的帖子。以下是两种常用写法:
写法1:使用JOIN关联查询
SELECT posts.*, users.username AS author_username FROM posts JOIN users ON posts.user_id = users.id JOIN user_followers ON user_followers.user_id = posts.user_id WHERE user_followers.follower_id = "当前用户ID" ORDER BY posts.created_at DESC;
- 关联
users表是为了获取作者用户名,方便信息流展示;如果不需要可以去掉这部分关联 ORDER BY posts.created_at DESC让最新的帖子排在最前面,符合信息流的常规需求
写法2:使用IN子查询
如果觉得JOIN逻辑绕,子查询的方式更直观:
SELECT * FROM posts WHERE user_id IN ( SELECT user_id FROM user_followers WHERE follower_id = "当前用户ID" ) ORDER BY created_at DESC;
先通过子查询拿到所有关注用户的ID,再筛选出这些用户发布的帖子,逻辑清晰易懂。
二、GORM链式查询实现
既然你用的是GORM,推荐用ORM链式查询保持代码风格统一,减少手写SQL的工作量:
方式1:一步关联查询(含作者信息)
// 定义结构体接收帖子+作者信息(可选,若不需要作者信息可直接用Post结构体) type PostWithAuthor struct { Post AuthorUsername string `gorm:"column:username"` } var posts []PostWithAuthor db.Table("posts"). Select("posts.*, users.username"). Joins("JOIN user_followers ON user_followers.user_id = posts.user_id"). Joins("JOIN users ON users.id = posts.user_id"). Where("user_followers.follower_id = ?", currentUserId). Order("posts.created_at DESC"). Scan(&posts)
方式2:分步查询(先拿关注用户ID,再查帖子)
如果需要对关注列表做额外处理,分步查询更灵活:
var followedUserIds []string db.Model(&UserFollowers{}). Where("follower_id = ?", currentUserId). Pluck("user_id", &followedUserIds) var posts []Post db.Where("user_id IN ?", followedUserIds). Order("created_at DESC"). Find(&posts)
注意事项
- 确保
user_followers表的user_id、follower_id字段类型,与users.id、posts.user_id一致(你的UserFollowers用了string类型,但gorm.Model的ID默认是uint,类型不匹配会导致查询失败,建议统一类型) - 如果需要在信息流中包含当前用户自己的帖子,只需在WHERE条件里追加
OR posts.user_id = "当前用户ID"即可
内容的提问来源于stack exchange,提问作者camelCaseIsGoodPractice
相关产品推荐
相关产品推荐

