全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-21 8 分钟 ✍️ juanwangdev

GORM 分组与聚合查询

本文介绍 GORM 中分组统计查询的实现方法。

聚合函数

Select 配合聚合函数

Go
// COUNT - 统计行数
db.Model(&User{}).Select("COUNT(*)").Find(&count)

// SUM - 求和
db.Model(&Order{}).Select("SUM(amount) as total").Find(&total)

// AVG - 平均值
db.Model(&Order{}).Select("AVG(amount) as avg_amount").Find(&avg)

// MAX/MIN - 最大最小值
db.Model(&Product{}).Select("MAX(price) as max_price").Find(&maxPrice)
db.Model(&Product{}).Select("MIN(price) as min_price").Find(&minPrice)

常用聚合函数:

函数说明示例
COUNT统计行数COUNT(*)COUNT(id)
SUM求和SUM(amount)
AVG求平均值AVG(price)
MAX最大值MAX(created_at)
MIN最小值MIN(stock)

Group 分组查询

基本分组

Go
// 按字段分组统计
db.Model(&Order{}).Select("user_id, COUNT(*) as order_count").Group("user_id").Find(&results)

// 多字段分组
db.Model(&Order{}).
    Select("user_id, status, COUNT(*) as cnt").
    Group("user_id, status").
    Find(&results)

// 分组后排序
db.Model(&Order{}).
    Select("user_id, SUM(amount) as total").
    Group("user_id").
    Order("total DESC").
    Find(&results)

Having 过滤分组

Go
// 分组后条件过滤
db.Model(&Order{}).
    Select("user_id, COUNT(*) as order_count").
    Group("user_id").
    Having("COUNT(*) > ?", 5).
    Find(&results)

// 多重条件
db.Model(&Order{}).
    Select("user_id, SUM(amount) as total").
    Group("user_id").
    Having("SUM(amount) > ? AND COUNT(*) > ?", 1000, 3).
    Find(&results)

// 聚合函数过滤
db.Model(&Product{}).
    Select("category_id, AVG(price) as avg_price").
    Group("category_id").
    Having("AVG(price) BETWEEN ? AND ?", 50, 200).
    Find(&results)

综合示例

Go
// 统计每个用户的订单总金额,筛选订单数大于3且总金额大于500的用户
db.Model(&Order{}).
    Select("user_id, COUNT(*) as cnt, SUM(amount) as total").
    Group("user_id").
    Having("COUNT(*) > ? AND SUM(amount) > ?", 3, 500).
    Order("total DESC").
    Limit(10).
    Find(&topUsers)

注意事项

  1. SELECT 中的聚合字段必须在 Group 字段列表中,或出现在聚合函数内。
  2. Having 用于过滤分组后的结果,Where 用于过滤分组前的原始数据。
  3. 使用 Scan 方法接收结果时,目标结构体需包含对应的聚合字段标签。
  4. 多字段分组时,Group 参数用逗号分隔或多次调用 Group 方法。

要点总结

  • 聚合函数(COUNT/SUM/AVG/MAX/MIN)配合 Select 实现数据统计。
  • Group方法按指定字段分组,支持多字段组合分组。
  • Having方法用于过滤分组后的结果,与 Where 区分使用。
  • 分组查询通常配合 Order/Limit 实现排序和分页。
  • 接收结果的结构体需正确映射聚合字段名称。

存放路径:D:\git2\jwdev\articles\GORM\进阶\高级查询技术\分组与聚合查询.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 GORM 多对多关系配置
下一篇 → GORM 分页查询实现
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库