什麼是 MySQL GROUP_CONCAT function 及如何使用
開始之前
雖然知道 MySQL 有 CONCAT()
這個 function,但怎麼想都達不到需要的目的,一查之下發現居然還有這個 function,又學到了一個。
這是什麼
GROUP_CONCAT()
是 MySQL 8.0 以上提供的 function,需搭配 GROUP BY
一起使用,會連接 group 後的資料。預設使用半形的 ,
連接,可設定其他的連接字。
怎麼使用
完整的使用語法如下:
1 | SELECT col1, GROUP_CONCAT(col2 [ORDER BY clause] [SEPARATOR string]) |
- ORDER BY clause:選填,會先對 col2 進行排序,再將 col2 的資料進行連接
- SEPARATOR string:連接 col2 資料的連接符。除了符號外,文字也行。使用一組單括號括起
使用範例
以下範例會使用三張 table Book
、Author
與 Author_Book
舉例,table schema 如下:
Table name | Column name | Type | Description |
---|---|---|---|
Book |
book_id |
integer | Primary key |
book_name |
varchar(100) | Not null | |
Author |
author_id |
integer | Primary key |
author_name |
varchar(100) | Not null | |
Author_Book |
author_id |
integer | not null |
book_id |
integer | not null |
並新增資料至對應 table,新增後的 table 內容會是:
Book
book_id |
book_name |
---|---|
1 | MySQL 語法大全 |
2 | MySQL 先刪庫後跑路 |
3 | SQLite 新手入門 |
Author
author_id |
author_name |
---|---|
1 | 作者 A |
2 | 作者 B |
3 | 作者 C |
Author_Book
author_id |
book_id |
---|---|
1 | 1 |
1 | 2 |
2 | 1 |
3 | 3 |
以上資料為有三本資料庫相關的書,其中作者 A 寫了兩本書,作者 B 與作者 A 共同寫了一本書,作者 B 自己也另外寫了一本,作者 C 則是自己獨自寫了一本。
範例一:取得作者與他們寫的書籍 id
目的是在一個 row 內取得作者 id 與他們寫的書籍 id,總共兩個 col,不限書籍 id 的連接方式。
1 | SELECT author_id, GROUP_CONCAT(book_id) |
結果:
1 | author_id GROUP_CONCAT(book_id) |
可以看到預設的連接符為半形的逗號,這邊也可以替 GROUP_CONCAT(book_id)
加上 AS
給一個新的 column name。
範例二:取得作者名稱與他們寫的書籍名稱們
目的是在一個 row 內取得作者名稱以及他們寫的書的書籍名稱,進行排序,並用中文的全形逗號「、」進行書籍名稱的連接。以下為了方便所以會使用 AS
簡稱各張 table,實際使用請斟酌,避免簡略太多反而不知道是對應哪一張 table。
1 | SELECT a.author_name AS author, |
結果:
1 | author books |
範例三:取得所有書籍 id 並連接成一個字串
目的是取得所有書籍 id ,並將他們連接成一組字串。
1 | SELECT GROUP_CONCAT(book_id) |
結果:
1 | GROUP_CONCAT(book_id) |
這邊比較特殊的是,因為 GROUP_CONCAT
需搭配 GROUP BY
使用,而這邊並沒有要 group 的對象,所以直接使用 NULL 進行 group。