xorm icon indicating copy to clipboard operation
xorm copied to clipboard

group by can not get count(*) count

Open trumpliu2018 opened this issue 5 years ago • 3 comments

struct :

type InspectReportMerge struct {
	InspectReportMergeId         string `xorm:"unique"`
	ParentProjectId              int
	HostHostId                   int
	HostHostName                 string
	HostHostIp                   string
	InspectReportMergeHostTag    string
	InspectReportMergeType       int
	InspectReportMergeReportTime time.Time
	InspectReportMergeValue      string
	DelFlag                      int
	Cnt                          int `xorm:"-"`
}

golang code:

var report []*report.InspectReportMerge
err = orm.In("parent_project_id", project_ids).Where(
		"inspect_report_merge_host_tag=?", tag).GroupBy("inspect_report_merge_type").Select(
		"inspect_report_merge_type,count(*) as cnt").Find(&report)
SELECT inspect_report_merge_type, count(inspect_report_merge_id) as cnt FROM `inspect_report_merge` WHERE `parent_project_id` IN (443) AND (inspect_report_merge_host_tag="linux") GROUP BY inspect_report_merge_type

has data:

inspect_report_merge_type cnt 2 8


log: [xorm] [info] 2019/06/27 11:53:22.583164 [SQL] SELECT inspect_report_merge_type,count(*) as cnt FROM inspect_report_merge WHERE parent_project_id IN (?) AND (inspect_report_merge_host_tag=?) GROUP BY inspect_report_merge_type []interface {}{443, "linux"}


but the struct Cnt is still 0 [0]:<*HostService/typesReport.InspectReportMerge>(0xc4202e0360) :<HostService/typesReport.InspectReportMerge> InspectReportMergeId:"" ParentProjectId:0 HostHostId:0 HostHostName:"" HostHostIp:"" InspectReportMergeHostTag:"" InspectReportMergeType:2 InspectReportMergeReportTime:<time.Time> InspectReportMergeValue:"" DelFlag:0 Cnt:0

trumpliu2018 avatar Jun 27 '19 03:06 trumpliu2018

func GroupByInspectHostReportsCntByProjectIdAndTag(project_ids []int32, tag, report_time string) ([]*report.InspectReportMerge, error) {
	var report []*report.InspectReportMerge
	var orm *xorm.Engine
	var err error = nil
	orm, err = GetEngine()

	location, err := time.LoadLocation("Asia/Shanghai")
	orm.TZLocation = location

	if err != nil {
		logs.Error("mysqlEngine error:", err.Error())
		return report, err
	}

	// reportBeginStr, reportEndStr := common.TimeRangeOneDay2String(report_time, location)

	// err = orm.In("parent_project_id", project_ids).Where(
	// 	"inspect_report_merge_host_tag=?", tag).And(
	// 	"inspect_report_merge_report_time>=?", reportBeginStr).And(
	// 	"inspect_report_merge_report_time<?", reportEndStr).And("del_flag=?", 0).Distinct("host_host_id").Select(
	// 	"inspect_report_merge_type, count(*) as cnt").GroupBy("inspect_report_merge_type").Find(&report)
	err = orm.In("parent_project_id", project_ids).Where(
		"inspect_report_merge_host_tag=?", tag).GroupBy("inspect_report_merge_type").Select(
		"inspect_report_merge_type,count(*) as cnt").Find(&report)
	if err != nil {
		logs.Error("orm error:", err.Error())
		return report, err
	}
	return report, err
}

trumpliu2018 avatar Jun 27 '19 04:06 trumpliu2018

With xorm:"-" flag, it will not be read from database.

lunny avatar Jun 27 '19 07:06 lunny

With xorm:"-" flag, it will not be read from database.

i use:

type InspectReportMergeGroup struct {
	InspectReportMergeType int
	Cnt                    int
}
var groups []*report.InspectReportMergeGroup
 orm.Table("inspect_report_merge").In("parent_project_id", project_ids)..Where(
		"inspect_report_merge_host_tag=?", tag).GroupBy("inspect_report_merge_type").Select(
		"inspect_report_merge_type,count(*) as cnt").Find(&groups)

then, it's ok now.

but i consider it's not a good way using like this. should be a better way. thanks.

trumpliu2018 avatar Jun 28 '19 01:06 trumpliu2018