1. 程式人生 > >MySQL 一表中欄位內容是用逗號分隔的 另一表含有對應資料的兩表聯合查詢

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