動かざることバグの如し

近づきたいよ 君の理想に

MySQLで複数カラムのマージして出現回数をカウントしたい

やりたいこと

例えばdata1、data2、data3のカラムがあってそれぞれのカラムを合体して文字の出現回数を調べたい

テーブル

CREATE TABLE `hoge` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `data1` varchar(255) NOT NULL,
  `data2` varchar(255) NOT NULL,
  `data3` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;

ダミーデータ

INSERT INTO `hoge` (`id`, `data1`, `data2`, `data3`)
VALUES
    (1, 'a', 'b', 'c'),
    (2, 'c', 'd', 'b'),
    (3, 'c', 'b', 'a'),
    (4, 'b', 'b', 'a'),
    (5, 'd', 'a', 'd');

SQL

select count(*) AS cnt, data1 from 
(select data1 from hoge
UNION ALL
select data2 from hoge
UNION ALL
select data3 from hoge
) AS tmp
group by data1 order by cnt desc

すると

cnt  data1
5   b
4   a
3   c
3   d

と取得できる