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)
注意事项
- SELECT 中的聚合字段必须在 Group 字段列表中,或出现在聚合函数内。
- Having 用于过滤分组后的结果,Where 用于过滤分组前的原始数据。
- 使用
Scan方法接收结果时,目标结构体需包含对应的聚合字段标签。- 多字段分组时,Group 参数用逗号分隔或多次调用 Group 方法。
要点总结
- 聚合函数(COUNT/SUM/AVG/MAX/MIN)配合 Select 实现数据统计。
- Group方法按指定字段分组,支持多字段组合分组。
- Having方法用于过滤分组后的结果,与 Where 区分使用。
- 分组查询通常配合 Order/Limit 实现排序和分页。
- 接收结果的结构体需正确映射聚合字段名称。
存放路径:D:\git2\jwdev\articles\GORM\进阶\高级查询技术\分组与聚合查询.md
📝 发现内容有误?点击此处直接编辑