前回のお試しから一歩進んだ使い方を見てみます〜
前回に引き続き、複数カラムを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)
ほほほう。ちゃんと思った通りの結果が返りました。もう何でもありですね。。