使用gorm进行数量统计

使用count方法

表结构模型

type Menu struct {
	gorm.Model
	Name      string    `gorm:"column:name"`
	Order	  string    `gorm:"column:order"`
}

查询示例

var menusCount int64
global.DB.Model(&Menu{}).Count(&menusCount)
// SELECT count(*) FROM "sys_app_menu" WHERE "sys_app_menu"."deleted_at" IS NULL
、、

可以看到,sql自动增加了查询条件 WHERE "sys_app_menu"."deleted_at" IS NULL。如果不想要这段内容,可以这样写

var menusCount int64
global.DB.Model(&Menu{}).Unscoped().Count(&menusCount)
// SELECT count(*) FROM "sys_app_menu"

此外,使用find、scan方法也可以实现相同的效果

//表结构模型
type AuthorityMenu struct {
	AuthorityId string `gorm:"column:authority_id;"`
	MenuID      uint   `gorm:"column:menu_id;"`
}

//使用Find方法进行统计
var adminMenusCount int64
global.DB.Model(&AuthorityMenu{}).Select("count(1)").Where("authority_id = '001'").Find(&adminMenusCount)
// SELECT count(1) FROM "authority_menu" WHERE authority_id = '0001'

//使用Scan方法进行统计
var adminMenusCount int64
global.DB.Model(&AuthorityMenu{}).Select("count(1)").Where("authority_id = '001'").Scan(&adminMenusCount)
// SELECT count(1) FROM "authority_menu" WHERE authority_id = '0001'

链式查询(复用查询条件)

查询示例如下:

var menuIds []uint
var menusCount int64
global.DB.Model(&AppMenu{}).Select("id").Find(&menuIds).Count(&menusCount)
// SELECT "id" FROM "sys_app_menu" WHERE "sys_app_menu"."deleted_at" IS NULL
// SELECT COUNT("id") FROM "sys_app_menu" WHERE "sys_app_menu"."deleted_at" IS NULL

分组查询和统计

//查询不同性别的人数
var staticGrade =[]struct{
	Grade	  string    `gorm:column:grade"`
	Number    string    `gorm:column:number"`
}{}
global.DB.Model(&AppMenu{}).Select("count(id) AS number ,grade").Group("grade").Find(&staticGrade)

limit、offset对count的统计的影响

错误示例1:请注意,如下例子中,Count放在了最后面,查询时,count方法也会加上Limit和offset这两个语句:

global.DB.Limit(10).Offset(2).Find(&users).Count(&total)

错误示例2:
下面这种方法,看似没啥问题,实际上count的时候也会带上分页。

var orm=global.DB.Where("id =1")
orm.Limit(10).Offset(2).Find(&users)
orm.Count(&total)

正确用法是,先count,然后再分页和find

global.DB.Count(&total).Limit(10).Offset(2).Find(&users)
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值