Red > Green > Refactor > Red

cycle is based on desire

GROUP_CONCAT ; MySQL

目的

  1. GROUP_CONCAT 関数の概要と使い方を知ること

1-0. どのような関数か

1-1. テーブルとコマンドを見つつ知る


どのような関数か

複数レコードを一行にまとめる


テーブルとコマンドを見つつ知る

次のテーブルが用意されている。

hand(持ち物)テーブル

id user_id name
1 1 pen
2 1 book_PHP
3 2 book_MySQL
4 2 laptop
5 2 CD_Audio
6 2 Keyboard
7 1 Card_Credit
8 1 Card_Trump
9 2 Eraser
10 2 Bag
11 1 Wallet
12 2 Vegetable

ここから、user_id = 1 に対応する name の集合を手に入れる。

イメージは

user_id user_id = 1 に対応した name の集合
1 pen,book_PHP,Card_Credit,Card_Trump,Wallet
mysql> SELECT user_id, group_concat(name) FROM hand WHERE user_id = 1;
+---------+--------------------------------------------+
| user_id | group_concat(name)                         |
+---------+--------------------------------------------+
|       1 | pen,book_PHP,Card_Credit,Card_Trump,Wallet |
+---------+--------------------------------------------+
1 row in set (0.01 sec)

order by OK

mysql> SELECT user_id, group_concat(name order by name) FROM hand WHERE user_id = 1;
+---------+--------------------------------------------+
| user_id | group_concat(name order by name)           |
+---------+--------------------------------------------+
|       1 | book_PHP,Card_Credit,Card_Trump,pen,Wallet |
+---------+--------------------------------------------+
1 row in set (0.00 sec)

order by desc OK

mysql> SELECT user_id, group_concat(name order by name desc) FROM hand WHERE user_id = 1;
+---------+--------------------------------------------+
| user_id | group_concat(name order by name desc)      |
+---------+--------------------------------------------+
|       1 | Wallet,pen,Card_Trump,Card_Credit,book_PHP |
+---------+--------------------------------------------+
1 row in set (0.00 sec)

distinct OK(レコード間に重複がないので結果は割愛)

SELECT user_id, group_concat(distinct name) FROM hand WHERE user_id = 1;

テーブル用意までのソースコード

CREATE TABLE hand (
id      INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
name CHAR(255) NOT NULL
);

INSERT INTO hand (user_id, name) VALUES
(1, 'pen'        ), (1, 'book_PHP'  ), (2, 'book_MySQL'),
(2, 'laptop'     ), (2, 'CD_Audio'  ), (2, 'Keyboard'  ),  
(1, 'Card_Credit'), (1, 'Card_Trump'), (2, 'Eraser'    ),  
(2, 'Bag'        ), (1, 'Wallet'    ), (2, 'Vegetable');

引用元

treeのメモ帳 GROUP_CONCATのコマンドとコード # 勉強になります