GORM多对多关联带条件查询:获取点赞量排名前50的图书实现方法
GORM 多对多关联按点赞数排序查询实现
你可以通过关联中间表做聚合统计的方式实现需求,两种常用实现方案如下:
基础实现(仅返回图书信息)
直接关联多对多中间表做分组统计,过滤、排序后取前50条即可:
var topLikedBooks []Book err := db.Model(&Book{}). // 关联点赞中间表 Joins("JOIN user_liked_books ulb ON ulb.book_id = books.id"). // 按图书ID分组统计 Group("books.id"). // 过滤获得过至少1次点赞的图书 Having("COUNT(ulb.user_id) > 0"). // 按点赞数倒序排序 Order("COUNT(ulb.user_id) DESC"). // 限制返回前50条 Limit(50). Find(&topLikedBooks).Error
带点赞数返回实现
如果需要同时拿到每本图书的具体点赞数,可以自定义接收结构体:
// 自定义结构体,继承Book字段+新增点赞数字段 type BookWithLikesCount struct { Book LikesCount int `gorm:"column:likes_count"` } var topLikedBooks []BookWithLikesCount err := db.Model(&Book{}). // 指定查询字段,包含统计出来的点赞数 Select("books.*, COUNT(ulb.user_id) as likes_count"). Joins("JOIN user_liked_books ulb ON ulb.book_id = books.id"). Group("books.id"). Having("likes_count > 0"). Order("likes_count DESC"). Limit(50). Find(&topLikedBooks).Error
注意事项
- 注意替换代码中的表名为你实际业务的表名,如果你自定义了GORM表名生成规则,需要同步修改
books、user_liked_books的取值 - 如果你的中间表开启了软删除功能,需要在
Joins后额外增加Where("ulb.deleted_at IS NULL")条件,避免统计到用户已取消的点赞记录 - 如果业务需要支持点赞数相同的图书按其他字段(如发布时间)排序,可以在
Order参数后追加排序规则,例如Order("likes_count DESC, books.created_at DESC")
内容的提问来源于stack exchange,提问作者CraigH
相关产品推荐
相关产品推荐

