xorm构建复杂sql
==背景==
找了很久,xorm正经的构建复杂sql的方式,记录一下
==SQL样例==
SELECT t1.id, t1.rules_unique, t1.device_id, t1.point_id, t1.point_judge, t1.point_value, t1.alarm_time, t1.alarm_value, t1.create_time, t1.update_time FROM `pulse_alarm_data` AS `t1` INNER JOIN ( SELECT rules_unique, MAX(id) AS max_id FROM pulse_alarm_data WHERE DATE_FORMAT(alarm_time, '%Y-%m-%d') >= "2022-05-24" AND DATE_FORMAT(alarm_time, '%Y-%m-%d') <= "2022-05-24" GROUP BY rules_unique ) pulse_alarm_data ON pulse_alarm_data.max_id = t1.id ORDER BY `t1`.`alarm_time` DESC LIMIT 10
==构建思路==
xorm builder
==代码样例==
package daos import ( "github.com/go-xorm/xorm" "log" "pulse-service/src/business/models" "pulse-service/src/business/request" "pulse-service/src/component" "pulse-service/src/utils" "xorm.io/builder" ) type AlarmDataDao struct { *component.Orm } const fieldAlarmData = ` t1.id, t1.rules_unique, t1.device_id, t1.point_id, t1.point_judge, t1.point_value, t1.alarm_time, t1.alarm_value, t1.create_time, t1.update_time ` func (add *AlarmDataDao) SelectAlarmDataByRulesByPage(param *request.GetAlarmData) ([]models.AlarmData, int64, error) { pageNum := param.PageNum pageSize := param.PageSize start := (pageNum - 1) * pageSize session := add.Engine.Select(fieldAlarmData) defer session.Close() makeAlarmQuerySql(session, param) session.Limit(pageSize, start) list := make([]models.AlarmData, 0) total, err := session.Desc("t1.alarm_time").FindAndCount(&list) if err != nil { log.Println(err.Error()) return nil, total, err } return list, total, nil } func makeAlarmQuerySql(session *xorm.Session, param *request.GetAlarmData) { cond := builder.NewCond() if param != nil && utils.IsNotEmpty(param.RulesUnique) { cond = cond.And(builder.Eq{"rules_unique": param.RulesUnique}) } if param != nil && utils.IsNotEmpty(param.DeviceId) { cond = cond.And(builder.Eq{"device_id": param.DeviceId}) } if param != nil && utils.IsNotEmpty(param.FromTime) { cond = cond.And(builder.Gte{"DATE_FORMAT(alarm_time, '%Y-%m-%d')": param.FromTime}) } if param != nil && utils.IsNotEmpty(param.ToTime) { cond = cond.And(builder.Lte{"DATE_FORMAT(alarm_time, '%Y-%m-%d')": param.ToTime}) } sub := builder.Select("rules_unique", "MAX(id) AS max_id") sub.From("pulse_alarm_data") sub.Where(cond) sub.GroupBy("rules_unique") session.Table("pulse_alarm_data").Alias("t1") session.Join("INNER", sub, "pulse_alarm_data.max_id = t1.id") }
--End--
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2017-05-24 编写文档五轮模式