1. 程式人生 > >mysql如何將一個欄位多個型別串成一個字串?

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; 

解決問題:
在這裡插入圖片描述
好了,本次的分享到這就結束了~~