場景如下,mysql根據用戶u_id查詢課程,不過該用戶的課程為多列數據
table users
table curriculums
查詢語句 select * from users as u join curriculums as c on c.u_id = u.u_id where c.u_id = 1
result
發現結果是多列數據,需求為一條數據返回,得到sql函數方法 CONCAT() 和 GROUP_CANCAT()
select u.u_id,u.nickename,CONCAT("[",GROUP_CONCAT('{"curr":"',c.c_name,'","price":',c.price,',"info":"',c.info,'"}'),"]") as datas from users as u join curriculums as c on c.u_id = u.u_id where c.c_name like '%o%' group by u.u_id
result
CONCAT() 和 GROUP_CANCAT() 都是把結果拼接為一條字符串,上面的例子演示為拼接為json字符串
如果業務需求減少查詢次數並一次查詢多個用戶的多個數據
golang的gorm框架操作可以制作以下結構體scan為數據
type users struct { Uid int `gorm:"column:u_id" json:"uid"` ...... } type curriculums struct { Cid int `gorm:"column:c_id" json:"cid"` Cname string `gorm:"column:c_name" json:"title"` Uid int `gorm:"column:u_id" json:"uid"` Price float64 `gorm:"column:price" json:"price"` } type result struct { users Datas string `gorm:"column:datas" json:"datas,omitempty"` # gorm:"column:datas" 為CONCAT() or GROUP_CANCAT() as 之后的名稱
# 需要對其中數據進行操作才用json反序列化操作Datas列數據為curriculums結構體,sql查詢時沒有對其操作
Cu curriculums `json:"curriculums"` }
var datas []result
db.Raw("sql語句 ... CONCAT() ...").Scan(&datas)
將數據scan到結構體中,其中result.Datas 含有的數據為這次在mysql中拼接的字符串,可以對其進行json反序列化操作
但是返回數據為json格式字符串了,如果無需其他操作可直接由一些框架返回 datas 切片結構體數據
其中注意點為:
1.查詢用戶id為1,其中該列數據admin_del為null,得到結果CONCAT 和 GROUP_CANCAT 拼接都會返回 空字符串
2.GROUP_CANCAT() 函數中可以進行另外的查詢
3.CONCAT和GROUP_CANCAT應用場景不同
例如一個用戶的多個課程查詢,如果使用 CONCAT 與一般查詢一般,返回的數據為多列
而GROUP_CANCAT則不同,會將多個列的結果拼接為一個字符串,而不是像join users 返回多列數據
上面的成功例子則內部使用GROUP_CANCAT先對多個數據列拼接,外部使用 [] 拼接為json格式
4.updata 中也能使用
update curriculums set info = CONCAT(c_name,"----") where c_id = 184
-----------------------------------------------------------分割線-------------------------------------------------------------------
本筆記自用 而已,如有錯誤請指正!