MySQL 一表中欄位內容是用逗號分隔的 另一表含有對應資料的兩表聯合查詢
有時為了資料庫簡潔,存放資料的時候,某一欄位採用逗號隔開的形式進行儲存。
一般情況這個欄位都應該具有如下幾個共性。
- 被分割的欄位一定是有限而且數量較少的,我們不可能在一個字串中儲存無限多個字元
- 這個欄位所屬的表與這個欄位關聯的表,一定是一對多的關係
下面舉例說明:
原表:
leader表
id name
1 李一
2 劉二
3 張三
4 李四
5 王五
staff表
id leaderid
1 1,2,3
2 2
3 4,5
4 4
5 2,3,4
想要的結果是:
id leaderid 領導姓名
1 1,2,3 李一,劉二,張三
2 2 劉二
3 4,5 李四,王五
4 4 李四
實現的SQL語句為:
select staff.id,staff.leaderid,GROUP_CONCAT(leader.name) as '領導姓名' from staff JOIN leader ON FIND_IN_SET(leader.id,staff.leaderid) GROUP BY staff.id
解析:上述語句涉及四個關鍵知識點:
1、join on
目的是連線leader表和staff表。
2、FIND_IN_SET(str,strlist)
該函式用於判斷 str 是否在 strlist 中,
如果是,作為條件,返回對應資料,
如果str不在strlist 或strlist 為空字串,則返回值為 0 。
3、GROUP_CONCAT(leader.name)
group_concat(),官方:該函式返回帶有來自一個組的連線的非NULL值的字串結果。
通俗點理解:group_concat()會計算哪些行屬於同一組,將屬於同一組的列按照一定的拼接規則拼接好顯示出來。
形象的來說就是把列裡的內容轉化到了行裡。
如果不使用該函式,只使用:
select * from staff JOIN leader
ON FIND_IN_SET(leader.id,staff.leaderid)
ORDER BY staff.id
該例的結果會變成:
id leaderid 領導姓名
1 1,2,3 李一
1 1,2,3 劉二
1 1,2,3 張三
2 2 劉二
3 4,5 李四
3 4,5 王五
4 4 李四
5 2,3,4 劉二
5 2,3,4