文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

group_concatで複数レコードを1行にまとめる:その2

前回のお試しから一歩進んだ使い方を見てみます〜


f:id:treeapps:20180418131549p:plain

前回に引き続き、複数カラムをgroup_concatしたらどうなるか気になったので試してみます。

group_concat + 複数カラムをgroup byしてみる

テストテーブル・データの準備

mysql> create table gc2 (id int auto_increment, uid int, v1 varchar(50), v2 varchar(50), primary key(id))engine=innodb charset=utf8mb4;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into gc2 (uid, v1, v2) values (1,'db','oracle'),(1,'db','mysql'),(1,'db','mysql'),(2,'lang','java'),(2,'lang','ruby'),(2,'lang','java');
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from gc2;
+----+------+------+--------+
| id | uid  | v1   | v2     |
+----+------+------+--------+
|  1 |    1 | db   | oracle |
|  2 |    1 | db   | mysql  |
|  3 |    1 | db   | mysql  |
|  4 |    2 | lang | java   |
|  5 |    2 | lang | ruby   |
|  6 |    2 | lang | java   |
+----+------+------+--------+
6 rows in set (0.00 sec)

実行してみる

さて、どうなるか・・・

mysql> select uid, group_concat(distinct v1, v2 separator ',') from gc2 group by uid;
+------+---------------------------------------------+
| uid  | group_concat(distinct v1, v2 separator ',') |
+------+---------------------------------------------+
|    1 | dboracle,dbmysql                            |
|    2 | langjava,langruby                           |
+------+---------------------------------------------+
2 rows in set (0.01 sec)

ほほう。v1とv2はそのまま集約されるようですね。group_concat内のdistinctで、v1とv2をgroup byした結果になりました。

もっといじってみましょう。

group_concat + if文 + concat + group by

mysql> select uid, group_concat(distinct concat(v1, '-'), if(v2 = 'ruby', 'RUBY', 'r u b y') separator ',') from gc2 group by uid;
+------+------------------------------------------------------------------------------------------+
| uid  | group_concat(distinct concat(v1, '-'), if(v2 = 'ruby', 'RUBY', 'r u b y') separator ',') |
+------+------------------------------------------------------------------------------------------+
|    1 | db-r u b y                                                                               |
|    2 | lang-r u b y,lang-RUBY                                                                   |
+------+------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> select uid, group_concat(distinct concat_ws('-', v1, v2) separator ',') from gc2 group by uid;
+------+-------------------------------------------------------------+
| uid  | group_concat(distinct concat_ws('-', v1, v2) separator ',') |
+------+-------------------------------------------------------------+
|    1 | db-oracle,db-mysql                                          |
|    2 | lang-java,lang-ruby                                         |
+------+-------------------------------------------------------------+
2 rows in set (0.00 sec)

ほほほう。ちゃんと思った通りの結果が返りました。もう何でもありですね。。