使用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)