ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

xorm构建复杂sql

2022-05-24 19:03:03  阅读:296  来源: 互联网

标签:alarm time param t1 构建 sql cond xorm id


==背景==

找了很久,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--

 

标签:alarm,time,param,t1,构建,sql,cond,xorm,id
来源: https://www.cnblogs.com/quchunhui/p/16306703.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有