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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:39:02