Przeglądaj źródła

fix: GROUP_CONCAT

hsun 3 tygodni temu
rodzic
commit
5e9dbfbdd3

+ 1 - 1
models/data_manage/base_from_hisugar.go

@@ -423,7 +423,7 @@ func GetHisugarIndexInfoPage(condition string, pars []interface{}, size int, pag
 // 获取所有分类
 func GetHisugarClassifyById(classifyId int) (ClassifyIds string, err error) {
 	o := global.DbMap[utils.DbNameIndex]
-	sql := fmt.Sprintf("SELECT %s AS classify_ids FROM base_from_hisugar_classify WHERE base_from_hisugar_classify_id=? OR parent_id=?", utils.GroupUnitFunc(utils.DbDriverName, "base_from_hisugar_classify_id", ","))
+	sql := fmt.Sprintf("SELECT %s AS classify_ids FROM base_from_hisugar_classify WHERE base_from_hisugar_classify_id=? OR parent_id=?", utils.GroupUnitFunc(utils.DbDriverName, "base_from_hisugar_classify_id", ",", false, "", "", false))
 	//sql := ` SELECT GROUP_CONCAT(base_from_hisugar_classify_id) AS classify_ids FROM base_from_hisugar_classify WHERE base_from_hisugar_classify_id=? OR parent_id=?`
 	//sql := ` SELECT AS classify_ids FROM base_from_hisugar_classify WHERE base_from_hisugar_classify_id=? OR parent_id=?`
 	err = o.Raw(sql, classifyId, classifyId).Scan(&ClassifyIds).Error

+ 2 - 2
models/data_manage/my_chart.go

@@ -452,7 +452,7 @@ func GetChartClassify(chartClassifyId int) (chart_classify_id string, err error)
 		chart_classify 
 WHERE
 	parent_id IN ( SELECT chart_classify_id FROM chart_classify WHERE parent_id = ? )
-			)AS t`, utils.GroupUnitFunc(utils.DbDriverName, "t.chart_classify_id", ","))
+			)AS t`, utils.GroupUnitFunc(utils.DbDriverName, "t.chart_classify_id", ",", false, "", "", false))
 	err = o.Raw(sql, chartClassifyId, chartClassifyId, chartClassifyId).Scan(&chart_classify_id).Error
 	return
 }
@@ -484,7 +484,7 @@ func GetMyChartListByAdminId(adminId int) (item []*MyChartView, err error) {
 			LEFT JOIN  my_chart_classify_mapping AS b ON a.my_chart_id=b.my_chart_id AND a.admin_id=b.admin_id
 			LEFT JOIN my_chart_classify AS c ON b.my_chart_classify_id=c.my_chart_classify_id AND b.admin_id=c.admin_id
 			WHERE 1=1 AND a.admin_id=?
-			GROUP BY a.chart_info_id `, utils.GroupUnitFunc(utils.DbDriverName, "c.my_chart_classify_id", ","))
+			GROUP BY a.chart_info_id `, utils.GroupUnitFunc(utils.DbDriverName, "c.my_chart_classify_id", ",", false, "", "", false))
 	err = o.Raw(sql, adminId).Find(&item).Error
 	return
 }

+ 20 - 6
models/data_manage/supply_analysis/variety.go

@@ -4,6 +4,7 @@ import (
 	"database/sql"
 	"eta/eta_api/global"
 	"eta/eta_api/utils"
+	"fmt"
 	"time"
 )
 
@@ -135,9 +136,15 @@ type VarietyButton struct {
 
 // GetListBySuperAdminPage 不区分是否有分析权限的获取分页数据
 func (item Variety) GetListBySuperAdminPage(condition string, pars []interface{}, startSize, pageSize int) (total int, items []*VarietyItem, err error) {
-	baseSql := ` FROM ( SELECT a.*, GROUP_CONCAT(DISTINCT b.sys_user_id ORDER BY b.sys_user_id ASC SEPARATOR ',') AS permission_user_id FROM variety a 
+	//baseSql := ` FROM ( SELECT a.*, GROUP_CONCAT(DISTINCT b.sys_user_id ORDER BY b.sys_user_id ASC SEPARATOR ',') AS permission_user_id FROM variety a
+	//			LEFT JOIN variety_admin_permission b on a.variety_id=b.variety_id
+	//			LEFT JOIN variety_edb_info c on a.variety_id=c.variety_id WHERE 1=1 `
+
+	baseSql := fmt.Sprintf(` FROM ( SELECT a.*, 
+%s AS permission_user_id FROM variety a 
 				LEFT JOIN variety_admin_permission b on a.variety_id=b.variety_id 
-				LEFT JOIN variety_edb_info c on a.variety_id=c.variety_id WHERE 1=1 `
+				LEFT JOIN variety_edb_info c on a.variety_id=c.variety_id WHERE 1=1 `, utils.GroupUnitFunc(utils.DbDriverName, "b.sys_user_id", ",", true, "b.sys_user_id", "ASC", true))
+
 	if condition != "" {
 		baseSql += condition
 	}
@@ -158,15 +165,21 @@ func (item Variety) GetListBySuperAdminPage(condition string, pars []interface{}
 
 	// 列表页数据
 	listSql := `SELECT * ` + baseSql + ` ORDER BY modify_time DESC,variety_id DESC LIMIT ?,?`
-	err = global.DbMap[utils.DbNameIndex].Raw(listSql, pars, startSize, pageSize).Find(&items).Error
+	pars = append(pars, startSize, pageSize)
+	err = global.DbMap[utils.DbNameIndex].Raw(listSql, pars...).Find(&items).Error
 	return
 }
 
 // GetListByPage 获取分页数据
 func (item Variety) GetListByPage(condition string, pars []interface{}, startSize, pageSize int) (total int, items []*VarietyItem, err error) {
-	baseSql := ` FROM ( SELECT a.*, GROUP_CONCAT(DISTINCT b.sys_user_id ORDER BY b.sys_user_id ASC SEPARATOR ',') AS permission_user_id FROM variety a 
+	//baseSql := ` FROM ( SELECT a.*, GROUP_CONCAT(DISTINCT b.sys_user_id ORDER BY b.sys_user_id ASC SEPARATOR ',') AS permission_user_id FROM variety a
+	//			JOIN variety_admin_permission b on a.variety_id=b.variety_id
+	//			JOIN variety_edb_info c on a.variety_id=c.variety_id WHERE 1=1 `
+
+	baseSql := fmt.Sprintf(` FROM ( SELECT a.*, %s AS permission_user_id FROM variety a 
 				JOIN variety_admin_permission b on a.variety_id=b.variety_id 
-				JOIN variety_edb_info c on a.variety_id=c.variety_id WHERE 1=1 `
+				JOIN variety_edb_info c on a.variety_id=c.variety_id WHERE 1=1 `, utils.GroupUnitFunc(utils.DbDriverName, "b.sys_user_id", ",", true, "b.sys_user_id", "ASC", true))
+
 	if condition != "" {
 		baseSql += condition
 	}
@@ -185,7 +198,8 @@ func (item Variety) GetListByPage(condition string, pars []interface{}, startSiz
 	}
 	// 列表页数据
 	listSql := `SELECT * ` + baseSql + ` ORDER BY modify_time DESC,variety_id DESC LIMIT ?,?`
-	err = global.DbMap[utils.DbNameIndex].Raw(listSql, pars, startSize, pageSize).Find(&items).Error
+	pars = append(pars, startSize, pageSize)
+	err = global.DbMap[utils.DbNameIndex].Raw(listSql, pars...).Find(&items).Error
 	return
 }
 

+ 17 - 5
utils/sql.go

@@ -18,7 +18,7 @@ var supportDriverMap = map[string]Driver{
 	"dm":    DM,
 }
 
-func GroupUnitFunc(driver string, column, delimiter string) (sqlStr string) {
+func GroupUnitFunc(driver string, column, delimiter string, columnOrder bool, orderField, orderRule string, hasDistinct bool) (sqlStr string) {
 	dbDriver, _ := getDriverInstance(driver)
 	if delimiter == "" {
 		delimiter = ","
@@ -29,13 +29,25 @@ func GroupUnitFunc(driver string, column, delimiter string) (sqlStr string) {
 	//if tableAlia != "" {
 	//	column = fmt.Sprintf("%s.%s", tableAlia, column)
 	//}
+	var sqlOrder, strDistinct string
+	if hasDistinct {
+		strDistinct = "DISTINCT"
+	}
+	if columnOrder && orderField == "" {
+		orderField = column
+	}
 	switch dbDriver {
-	case MySql:
-		sqlStr = fmt.Sprintf("GROUP_CONCAT(%s SEPARATOR '%s')", column, delimiter)
 	case DM:
-		sqlStr = fmt.Sprintf("LISTAGG(%s, '%s') WITHIN GROUP (ORDER BY %s)", column, delimiter, column)
+		if columnOrder {
+			sqlOrder = fmt.Sprintf("WITHIN GROUP (ORDER BY %s %s)", orderField, orderRule)
+		}
+		sqlStr = fmt.Sprintf("LISTAGG(%s %s, '%s') %s", strDistinct, column, delimiter, sqlOrder)
 	default:
-		sqlStr = fmt.Sprintf("GROUP_CONCAT(%s SEPARATOR '%s')", column, delimiter) // 默认使用 MySQL 的语法
+		// 默认使用MySQL的语法
+		if columnOrder {
+			sqlOrder = fmt.Sprintf("ORDER BY %s %s", orderField, orderRule)
+		}
+		sqlStr = fmt.Sprintf("GROUP_CONCAT(%s %s %s SEPARATOR '%s')", strDistinct, column, sqlOrder, delimiter)
 	}
 	return sqlStr
 }