mysql如何將一個欄位多個型別串成一個字串?
結論
先說結論,可以使用group_concat group by
的組合實現多行變一行,將一個欄位的多個型別串成一個欄位
需求:
如題,一個欄位如電影類別,一部電影可以是多個類別,如喜劇、動作片等,其形式可以是這樣的1::Toy Story (1995)::Animation|Children's|Comedy
欄位分別為id,電影名稱,電影類別
現有一表cour_info,儲存課程與專業的關係,而課程與專業是一對多關係,即一個KCMC可以對應多個major,現在需要將major欄位處理為電影類別類似的形式,該如何處理?
嘗試
第一印象想到的是利用update SQL語句進行major欄位的字串拼接的方法,主要使用concat()方法
步驟一:對錶cour_info進行復制,得下表
使用語句
UPDATE cour3,cour_info
set cour3.major= concat_ws('|',ifNULL(cour3.major,''),cour_info.major)
WHERE cour3.KCMC = cour_info.KCMC and cour3.KCMC = '思想道德修養與法律基礎';
這裡,查詢兩張表得kcmc為“思想道德修養與法律基礎”的相同記錄,利用原表major不斷對新表major進行字串拼接,但是並沒有像我預想一樣,這個語句僅把第一個major拼接了上去,sql功力太淺~~~
原表形如
這種做法失敗了,不知道咋回事,有知道的小夥伴可以告訴博主~~
再嘗試
這一次使用group_concat group by
的組合實現
一開始不知道怎麼使用group_concat
發現這樣可以使用
SELECT cour_info.KCMC,GROUP_CONCAT(cour_info.major separator'|')
FROM cour_info WHERE cour_info.KCMC = '思想道德修養與法律基礎'
結果如下
但是去除where條件後結果出錯,只存在第一條記錄
大發奇想,難道需要分組查詢??
結果驗證我的猜想,嘿嘿
此時,我意識到group_concat xx group by
檢視group_concat xx group by用法
這時,查詢出的結果有重複,可以使用distinct去重,程式碼如下
GROUP_CONCAT(distinct cour_info.major separator '|')
使用SQL語句更新新表
UPDATE cour3,
(SELECT cour_info.KCMC kc,
substring_index(GROUP_CONCAT(distinct cour_info.major separator'|'), '|',16) ma
FROM cour_info GROUP BY cour_info.KCMC)temp
set cour3.major=temp.ma
WHERE cour3.KCMC = temp.kc
因為類別對應過多,這裡取16個作為最大的數量
但是發生了錯誤ERROR 1260 (HY000): Row 17 was cut by GROUP_CONCAT()
,這是因為
group_concat存在長度限制
最終新增SQL語句
SET GLOBAL group_concat_max_len=102400;
SET SESSION group_concat_max_len=102400;
解決問題:
好了,本次的分享到這就結束了~~