今回は、
検証環境
今回はDocker ImageのMySQL 8.
検証データのロードの方法に関しては、
group_concat()とは?
MySQLに用意されている集計関数の一種で、
$ mysql -h127.0.0.1 -uroot -pmy-secret-pw zipcode
まずは113回と同様にMySQLに入ります。そして以下のクエリを実行してみましょう。以下のクエリは町単位でgroup byを行ったときの郵便番号を1つの文字列として取得するというコードになります。
mysql> select town, group_concat(zip_code) from zipcode group by town\G
実行結果は以下の通りになります。
~省略~ *************************** 86624. row *************************** town: 黄金町 group_concat(zip_code): 5128062,7940037,2310054,0750252,8360872,7530045,8000027,8990125,8660845 *************************** 86625. row *************************** town: 黄金町東 group_concat(zip_code): 0730012 ~省略~ 86956 rows in set, 8 warnings (0.32 sec)
実行結果は8万6,000件と非常に大きいので、
mysql> select * from zipcode where town = '黄金町' -> ; +-------+-------------+----------+-----------------------+-----------------------------------------+-----------------------+--------------+-----------------------+-----------+ | code | old_zipcode | zip_code | prefecture_kana | city_kana | town_kana | prefecture | city | town | +-------+-------------+----------+-----------------------+-----------------------------------------+-----------------------+--------------+-----------------------+-----------+ | 01216 | 07502 | 0750252 | ホッカイドウ | アシベツシ | コガネチョウ | 北海道 | 芦別市 | 黄金町 | | 14104 | 231 | 2310054 | カナガワケン | ヨコハマシナカク | コガネチョウ | 神奈川県 | 横浜市中区 | 黄金町 | | 24202 | 512 | 5128062 | ミエケン | ヨッカイチシ | コガネチョウ | 三重県 | 四日市市 | 黄金町 | | 35203 | 753 | 7530045 | ヤマグチケン | ヤマグチシ | コガネチョウ | 山口県 | 山口市 | 黄金町 | | 38202 | 794 | 7940037 | エヒメケン | イマバリシ | コガネチョウ | 愛媛県 | 今治市 | 黄金町 | | 40101 | 800 | 8000027 | フクオカケン | キタキュウシュウシモジク | コガネマチ | 福岡県 | 北九州市門司区 | 黄金町 | | 40202 | 836 | 8360872 | フクオカケン | オオムタシ | コガネマチ | 福岡県 | 大牟田市 | 黄金町 | | 43202 | 866 | 8660845 | クマモトケン | ヤツシロシ | コガネチョウ | 熊本県 | 八代市 | 黄金町 | | 46208 | 89901 | 8990125 | カゴシマケン | イズミシ | コガネマチ | 鹿児島県 | 出水市 | 黄金町 | +-------+-------------+----------+-----------------------+-----------------------------------------+-----------------------+--------------+-----------------------+-----------+ 9 rows in set (0.07 sec)
ここで見ていただきたいのはzip_
使用する上での注意点
さて、
mysql> select town, group_concat(zip_code) from zipcode where town = '以下に掲載がない場合' ;
実行してみると以下のような結果が得られます。
+--------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | town | group_concat(zip_code) | +--------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | 以下に掲載がない場合 | 0600000,0010000,0650000,0030000,0620000,0050000,0630000,0040000,0060000,0040000,0400000,0470000,0700000,0500000,0850000,0800000,0900000,0680400,0680000,0930000,0770000,0530000,0970000,0720000,0750000,0670000,0791100,0940000,0950000,0960000,0682100,0870000,0660000,0730000,0730100,0730400,0740000,0760000,0590000,0611400,0520000,0611100,0613200,0490100,0610200,0681100,0491500,0491300,0491100,0490400,0411100,0411400,0492300,0493100,0493500,0430000,0490600,0431100,0430100,0431400,0494300,0494500,0480600,0480400,0480100,0481300,0481500,0481600,0481700,0440200,0440100,0440000,0482200,0450000,0450200,0450300,0460200,0460100,0482400,0460000,0460500,0690200,0790300,0730200,0691200,0691300,0691500,0610500,0610600,0731100,0790500,0782100,0782600,0782500,0782200,0711200,0711500,0781300,0780300,0781400,0781700,0711400,0710200,0710500,0710700,0792400,0792200,0980100,0980300,0981200,0982200,0982500,0982800,0740400,0770200,0783300,0783700,0784100,0784400,0983500,0983300,0986200,0985700,0985500,0985800,0984100,0971200,0970400, | +--------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set, 1 warning (0.06 sec)
注目して欲しいところとしては、0970400,
なのですが、,
となっていて何やら続きそうな雰囲気があります。それに最後のwarningが発生している事もわかります。
warningsを見るために、SHOW WARNINGS
コマンドを利用して見ましょう。注意点としては、SHOW WARNINGS
コマンドは1つ前に実行されたSQLのwarningが見れるコマンドなので、
mysql> SHOW WARNINGS; +---------+------+-----------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------+ | Warning | 1260 | Row 129 was cut by GROUP_CONCAT() | +---------+------+-----------------------------------+ 1 row in set (0.00 sec)
メッセージを読んでみると、
結果は、
group_ concat_ max_ len システム変数で指定された最大長まで切り捨てられました。その変数のデフォルト値は1024です。
ということで、
さて、SET SESSION
構文で設定をしていきたいのですが、
mysql> select town, count(zip_code) from zipcode where town = '以下に掲載がない場合' ; +--------------------------------+-----------------+ | town | count(zip_code) | +--------------------------------+-----------------+ | 以下に掲載がない場合 | 1874 | +--------------------------------+-----------------+ 1 row in set (0.06 sec)
1874カラムあることがわかりました。先頭から最後の1つ前の文字までは郵便番号とカンマを入れて8文字が必要で、SET SESSION
構文を使って設定してみましょう。
mysql> set session group_concat_max_len=14991; Query OK, 0 rows affected (0.00 sec) mysql> select town, group_concat(zip_code) from zipcode where town = '以下に掲載がない場合' ; ~省略~ 1 row in set (0.06 sec)
結果が大きすぎるため省略させていただきますが、
mysql> set session group_concat_max_len=14991; Query OK, 0 rows affected (0.00 sec) mysql> select town, group_concat(zip_code) from zipcode where town = '以下に掲載がない場合' ; ~省略~ 1 row in set, 1 warning (0.05 sec)
こちらは警告が出ているので、
ちなみに、
ということなら、
また、
まとめ
今回はgroup_
皆さんもぜひ一度試してみてはいかがでしょうか。