kakakakakku blog

Weekly Tech Blog: Keep on Learning!

スタンディングデスクを買おうかと悩んでいる人にオススメする「LEVIT8」

運動不足と感じる場面も多く,自宅に「電動昇降式スタンディングデスク」を買おうかと悩んでいたところ,Twitter で @budougumi0617 さんに「LEVIT8」を教えてもらった.すぐに購入し,約2ヶ月半使っているけど,とにかく最高なので記事を書くことにした.

「LEVIT8」とは?

「LEVIT8」は折りたたみ式のスタンディングデスクで,デスクの上に「ひねって立てて」使う.折りたたみ式なので,使わないときは片付けておくことができる.価格も例えば「L サイズ」「3500円」なので,高価な「電動昇降式スタンディングデスク」と比べて,お手軽と言える.「LEVIT8」を購入してから,自宅作業の多くの時間をスタンディングで過ごし,コンピュータ以外の作業をする場合は,今まで10年以上も愛用している「Ergohuman」の椅子に座っている.ポモドーロに集中できるし,運動不足も解消できるし,とにかく満足している!当然ながら,姿勢と重心を間違えるとスタンディングでも骨盤などに負担がかかるので,気を付けること!

(自宅の LEVIT8 + MacBook Pro 環境)

サイズ展開

サイズ展開は現在4種類で「S / M / L / XL」がある.目線を合わせるために,机の高さや身長などを考慮して選ぶと良さそう.ただし,Amazon に記載されているサイズは正しくなく,Kickstarter に載っているサイズも微妙に違う気がする.僕自身は「L サイズ」を使っているので,参考までに「素人採寸」を載せておく.なお,Amazon の出品者には表記を正しくしてもらうように報告をしてある 🚧

  • L サイズ : 折りたたんだとき(素人採寸)
    • 42.5 cm (縦) x 24.0 cm x 1.5 cm
  • L サイズ : ひねったとき(素人採寸)
    • 35.5 cm (縦) x 24.0 cm x 24.0 cm

Kickstarter

「LEVIT8」を調べると,2015年末に Kickstarter でクラウドファンディングを実施し,成功していた.

https://www.kickstarter.com/projects/1459624267/levit8-the-first-truly-portable-standing-deskwww.kickstarter.com

ひねる技術

「LEVIT8」の特徴は「ひねって立てて」使う点にあり,慣れれば本当にサッとひねることができるけど,逆に言うと慣れるまでは非常に難しく,パズルのように感じる.以下の YouTube を何度も見て練習をした.

www.youtube.com

まとめ

  • 「電動昇降式スタンディングデスク」を買おうかと悩んでいる人にオススメする「LEVIT8」を約2ヶ月半使っている
  • 例えば「L サイズ」だと「3500円」で買える
  • ポモドーロに集中できるし,運動不足も解消できるし,とにかく満足している!(姿勢と重心には注意すること!)

関連記事

kakakakakku.hatenablog.com

最新バージョン Redash v6.0.0 をすぐに試せる「Redash ハンズオン資料」

2018年12月に「Redash v6.0.0」がリリースされた 🎉

blog.redash.io

Redash ハンズオン資料 v6.0.0 サポート

さっそく「Redash ハンズオン資料」で「Redash v6.0.0」をサポートした.サクッと Redash v6.0.0 を試すときに使ってもらえると!なお「Redash ハンズオン資料」は,2017年12月に公開し,既に1年間メンテナンスをしている.Redash バージョンで言うと v2 → v4 → v5 とメジャーバージョンをサポートし続けている.

github.com

主な変更点を以下にまとめる.

  • 全てのスクリーンキャプチャを撮り直した
  • Docker Compose の Compose file を version 3 に変更した
    • Redash / Redis / PostgreSQL の Docker イメージも Redash 公式に合わせて変更した
  • UI 変更に合わせて文章を一部変更した

Redash v6.0.0 変更点

Redash v6.0.0 で個人的にイイ!と感じる新機能は以下がある.特に「IBM Db2」は SIer 時代にずっと運用してた経験もあり,最近だと IBM Db2 Express-C を Docker で起動できるため,今度試そうと思う.正確に言うと,2017年に名称変更があり,現在は「DB2」ではなく「Db2」と書く.データソース名は「DB2」になっていて少し気になる...!

  • データソースに「IBM Db2」が追加された
  • アラートに「PagerDuty」が追加された
  • クエリエディタで「Live Autocomplete」が使えるようになった
  • MySQL で sys スキーマが対象外になった
  • チャート種類に「ヒートマップ」が追加された

MySQL で sys スキーマが対象外になったのも嬉しくて,例えば「Redash ハンズオン資料」だと,以下のように差がある.

f:id:kakku22:20190102001710p:plain

詳細な Changelog は GitHub のリリース情報と @kyoshidajp さんの記事にまとまっている.

Feature Flags とは?

Redash v6.0.0 の動作確認をしていたら Settings 画面に「Feature Flags」という設定項目が増えていて,現在は「Enable experimental multiple owners support」とある.ほとんど情報がなく,どんな機能だろう?

f:id:kakku22:20190102001814p:plain

まとめ

「Redash ハンズオン資料」を使って Redash v6.0.0 を試そう!

github.com

関連記事

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

2018年の振り返りと2019年の抱負

2018年の振り返り 🎉

幅広く実戦投入をした

2016年から3年連続で目標にしている「実戦投入力を高める」を2018年も達成できた.インフラ関連で言うと「Redis on EC2 → Amazon ElastiCache 移行」「Embulk データ抽出基盤構築」「Zabbix → Mackerel 完全移行」など(書ける事例で言うと).サーバサイド関連で言うと,去年に続き「Go + Amazon ECS でのマイクロサービス構築」を推進した.また2018年は苦手意識のあったフロントエンド関連にも挑戦する1年となり,トレンドとも言える「Vue.js」を初経験し,プロダクション環境に実戦投入をすることもできた.幅広く実戦投入をした1年だと感じる.

また2018年は「プロジェクトリード」での事例を多く作ることができた.数年前からスクラムマスターとテックリードを兼任するポジションを担当しているものの,4月に公開した資料「プロジェクトをリードする技術」に大きな反響を頂くことができた.アジャイル推進の経験に加えて「ファシリテーション / 組織論 / 心理学 / メンタリング」などの領域も合わせて学び,実際にプロジェクトで最高の成果を出せたこともあり,個人的に2018年の中でもインパクトのある経験になった.

「教えること」を仕事にした

2017年を「技術を教えるための基礎力を整える1年間」と位置付けて,副業で Ruby / Rails 講師をはじめた.そして,2018年夏頃まで副業を続けて,最終的に「約50人」の生徒さんを卒業させることができた.エンジニアになることを目指している人をサポートすることができ,非常に嬉しい.さらに「2018年の抱負」で宣言した通り,2018年を「本格的に動き出す1年間」と位置付けていたこともあり,8月に転職をし,現在は「教えること」を仕事にしている.技術講師として「教えること」「楽しさ」「難しさ」を日々感じながら,仕事を楽しめている.

インプット/アウトプット 💡

登壇

2018年の登壇は計9回となった.既にまとめてある.

kakakakakku.hatenablog.com

勉強会

2018年はあまり勉強会に参加せず,登壇するときに参加することが多かった.印象的なのは4月に参加した「Japan Container Days v18.04」で,現在のトレンドとも言える「Kubernetes」の導入事例を多く聞くことができた.

プルリクエスト

2018年は計11個のプルリクエストを OSS に送ることができた.既にまとめてある.

kakakakakku.hatenablog.com

ブログ

2018年も「週1回」のノルマを達成し「計78記事」を書いた.ブログを書くことは習慣化できているため,仕事がどんなに忙しくても,娘(2人目)が生まれても,ノルマを達成し続けることができた.ブログネタはまだまだ大量にあり,2019年に持ち越すことにした.そして Google Analytics で PV を振り返ると,1年間を通して,2017年よりも増えていた.毎月 30000 PV を達成していることは2017年からの成長と言える.

f:id:kakku22:20190101022229p:plain

2018年はホッテントリに入る記事が非常に多かった.その結果もあり,累計ブクマ数は2018年で「6573 → 12285 (+5712)」となり,大きく伸びた1年間だった.2018年1月の時点では,ここまで伸びるとは予想していなかった.2019年も需要のある記事を書けるように頑張る.

f:id:kakku22:20190101022301p:plain

特に 500 ブクマを超えた記事を3本も書くことができた.

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

ブログメンタリング

2017年末からはじめた「ブログメンタリング活動」は2018年も継続することができた.そして,2018年12月までに卒業したブログメンティは「計16人」となった.どんどんメンタリングの応募倍率が上がっているけど,2019年も「ブログメンタリング活動」は続ける.もしメンティ希望の場合は僕の Twitter をフォローしておいて頂けると良いかと!

ポッドキャスト

2018年は @iwashi86 さんに呼んで頂き,人気ポッドキャスト「Fukabori.fm」に出演することができた.ありがとうございました!

fukabori.fm

読んだ本

2018年は計12冊を読むことができた.ただし,中途半端に読んで書評記事を書けていない本があるので,2019年に持ち越すことになってしまった.読むのが遅いし,積読が増えてしまう状況は引き続きだけど,2019年は毎月1冊以上読めるように計画したいと思う.

2019年の抱負 ✨

幅広く技術を語れるように学び続ける

2019年の目標を「幅広く技術を語れるように学び続ける」に決めた.2016年から3年連続で掲げてきた「実戦投入力を高める」という目標に区切りを付けて,2019年はあえて「幅を広げる」ことに努力をする.まだまだ未経験の技術が多くあるし,トレンド技術だけではなく,要素技術も対象に学ぶ.当然ながら,アウトプットをする前提で学ぶので,学んだ内容はブログにまとめる.

教えることの本質を追求する

もう1個の目標は「教えることの本質を追求する」に決めた.技術講師として,ただ教えるのではなく,記憶に残るような学びを提供できるように,教えることの本質を追求する.そのためには,技術を学ぶだけではなく,例えば「アクティブラーニング」「教育心理学」「インストラクショナルデザイン(教育設計)」など,教育関連の領域を学ぶ必要がある.技術講師として,圧倒的に成長する!

まとめ

2019年も攻めていくぞ 🔥

過去の振り返り

2018年 : 登壇を振り返る

今年の登壇を振り返る.去年の振り返り記事は以下にある.

kakakakakku.hatenablog.com

登壇 : 計9回

今年の登壇は計9回だった.去年の計14回よりも減ってしまった.

  • 勉強会 : 登壇8回
  • 社内勉強会 : 登壇1回

時系列で並べると以下のようになる.

振り返り

プロジェクトリード

社内勉強会のために作った「プロジェクトをリードする技術」という資料に大きな反響があり,今年最大のターニングポイントになった.人生初となる 1000 ブクマを達成したり,Kyash 様の社内イベントで再演をさせて頂いたり,F.O.X Meetup に登壇した内容を書き起こして頂いたりもした.ここまで大きな反響になるとは予想していなかったけど,プロジェクトリードのノウハウを資料として言語化できて良かった.

logmi.jp

アウトプット

豪雨の影響もあり中止になってしまったけど,「DevLOVE 関西」に登壇する予定だった「楽しく!アウトプットを習慣化しよう」という資料にも大きな反響があった.アウトプットに悩む人たちの背中を少しでも押せたら良いなと思っていたし,アウトプットを習慣化することによって良いことがあるということも伝えられたと思う.この資料を公開してからブログメンタリングの希望者がとにかく増えた!

技術

今年は技術ネタの登壇をあまりしてなく,計3回となった.そのうち2回は「Rails 関連」で,プログラミング講師としての学びを伝えた.残り1回は「インフラ関連」で,Mackerel で Amazon ECS をモニタリングする方法を詳細に解説した.今年は実戦投入した技術が他にも多くあったので,もっと登壇するべきだったという反省もある.

登壇する技術

今年も「登壇する技術」をまとめた過去記事を参考に貼っておく!

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

資料一覧

知っておくと便利な MySQL の GROUP_CONCAT 関数

最近 MySQL で SQL の相談を受けたときに「もしかしたら GROUP_CONCAT が使えるかも?」というアドバイスをした.GROUP BY だけではなく GROUP_CONCAT も知っておくと便利なので,今回は GROUP_CONCAT の紹介記事を書く.

GROUP_CONCAT とは?

GROUP_CONCAT を使うと GROUP BY で集約をしたレコードのデータを「連結した文字列として」返すことができる.

検証用データセット

今回は MySQL 5.7 で,MySQL から公式に公開されているデータセット「world database」を使って検証をする.

既に「world database」を含めた Docker イメージを公開しているので,今回は kakakakakku/mysql-world-database:5.7 を使う.

$ docker pull kakakakakku/mysql-world-database:5.7
$ docker run -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d kakakakakku/mysql-world-database:5.7
$ docker exec -it $(docker container ls | grep 'kakakakakku/mysql-world-database' | awk '{print $1}') /bin/sh

詳しくは以下の記事にまとめてある.

kakakakakku.hatenablog.com

GROUP_CONCAT を試す

まず「日本の都市名」を都道府県ごとに集計し,連結した文字列として返す SQL を書く.

SELECT District, COUNT(Name), GROUP_CONCAT(Name)
FROM city
WHERE CountryCode = 'JPN'
GROUP BY District
ORDER BY COUNT(Name) DESC;

実行すると,以下のように「日本の都市名」をカンマ区切りで取得できる.データセットの問題で,予想以上に「日本の都市名」が少ないこともわかる.

mysql> SELECT District, COUNT(Name), GROUP_CONCAT(Name)
    -> FROM city
    -> WHERE CountryCode = 'JPN'
    -> GROUP BY District
    -> ORDER BY COUNT(Name) DESC;
+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| District  | COUNT(Name) | GROUP_CONCAT(Name)                                                                                                                                                                         |
+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Osaka     |          22 | Osaka,Sakai,Higashiosaka,Hirakata,Toyonaka,Takatsuki,Suita,Yao,Ibaraki,Neyagawa,Kishiwada,Izumi,Moriguchi,Kadoma,Matsubara,Daito,Minoo,Tondabayashi,Kawachinagano,Habikino,Ikeda,Izumisano |
| Saitama   |          21 | Urawa,Kawaguchi,Omiya,Kawagoe,Tokorozawa,Koshigaya,Soka,Ageo,Kasukabe,Sayama,Kumagaya,Niiza,Iruma,Misato,Asaka,Iwatsuki,Toda,Fukaya,Sakado,Fujimi,Higashimatsuyama                         |
| Chiba     |          19 | Chiba,Funabashi,Matsudo,Ichikawa,Kashiwa,Ichihara,Sakura,Yachiyo,Narashino,Nagareyama,Urayasu,Abiko,Kisarazu,Noda,Kamagaya,Nishio,Kimitsu,Mobara,Narita                                    |
| Tokyo-to  |          18 | Tokyo,Hachioji,Machida,Fuchu,Chofu,Kodaira,Mitaka,Hino,Tachikawa,Hitachinaka,Ome,Higashimurayama,Musashino,Higashikurume,Koganei,Kokubunji,Akishima,Hoya                                   |
| Aichi     |          15 | Nagoya,Toyohashi,Toyota,Okazaki,Kasugai,Ichinomiya,Anjo,Komaki,Seto,Kariya,Toyokawa,Handa,Tokai,Inazawa,Konan                                                                              |
| Kanagawa  |          15 | Jokohama [Yokohama],Kawasaki,Sagamihara,Yokosuka,Fujisawa,Hiratsuka,Chigasaki,Atsugi,Yamato,Odawara,Kamakura,Hadano,Zama,Ebina,Isehara                                                     |
| Hyogo     |          11 | Kobe,Amagasaki,Himeji,Nishinomiya,Akashi,Kakogawa,Takarazuka,Itami,Kawanishi,Sanda,Takasago                                                                                                |
| Hokkaido  |          10 | Sapporo,Asahikawa,Hakodate,Kushiro,Obihiro,Tomakomai,Otaru,Ebetsu,Kitami,Muroran                                                                                                           |
| Shizuoka  |           9 | Hamamatsu,Shizuoka,Shimizu,Fuji,Numazu,Fujieda,Fujinomiya,Yaizu,Mishima                                                                                                                    |
| Mie       |           6 | Yokkaichi,Suzuka,Tsu,Matsusaka,Kuwana,Ise                                                                                                                                                  |
| Yamaguchi |           6 | Shimonoseki,Ube,Yamaguchi,Hofu,Tokuyama,Iwakuni                                                                                                                                            |
| Fukuoka   |           5 | Fukuoka,Kitakyushu,Kurume,Omuta,Kasuga                                                                                                                                                     |
| Gumma     |           5 | Maebashi,Takasaki,Ota,Isesaki,Kiryu                                                                                                                                                        |
| Hiroshima |           5 | Hiroshima,Fukuyama,Kure,Higashihiroshima,Onomichi                                                                                                                                          |
| Ibaragi   |           5 | Mito,Hitachi,Tsukuba,Tama,Tsuchiura                                                                                                                                                        |
| Fukushima |           4 | Iwaki,Koriyama,Fukushima,Aizuwakamatsu                                                                                                                                                     |
| Gifu      |           4 | Gifu,Ogaki,Kakamigahara,Tajimi                                                                                                                                                             |
| Kyoto     |           4 | Kioto,Uji,Maizuru,Kameoka                                                                                                                                                                  |
| Nagano    |           4 | Nagano,Matsumoto,Ueda,Iida                                                                                                                                                                 |
| Nara      |           4 | Nara,Kashihara,Ikoma,Yamatokoriyama                                                                                                                                                        |
| Niigata   |           4 | Niigata,Nagaoka,Joetsu,Kashiwazaki                                                                                                                                                         |
| Tochigi   |           4 | Utsunomiya,Ashikaga,Oyama,Kanuma                                                                                                                                                           |
| Yamagata  |           4 | Yamagata,Sakata,Tsuruoka,Yonezawa                                                                                                                                                          |
| Aomori    |           3 | Aomori,Hachinohe,Hirosaki                                                                                                                                                                  |
| Ehime     |           3 | Matsuyama,Niihama,Imabari                                                                                                                                                                  |
| Miyazaki  |           3 | Miyazaki,Miyakonojo,Nobeoka                                                                                                                                                                |
| Nagasaki  |           3 | Nagasaki,Sasebo,Isahaya                                                                                                                                                                    |
| Okayama   |           3 | Okayama,Kurashiki,Tsuyama                                                                                                                                                                  |
| Okinawa   |           3 | Naha,Okinawa,Urasoe                                                                                                                                                                        |
| Shiga     |           3 | Otsu,Kusatsu,Hikone                                                                                                                                                                        |
| Ishikawa  |           2 | Kanazawa,Komatsu                                                                                                                                                                           |
| Kumamoto  |           2 | Kumamoto,Yatsushiro                                                                                                                                                                        |
| Miyagi    |           2 | Sendai,Ishinomaki                                                                                                                                                                          |
| Oita      |           2 | Oita,Beppu                                                                                                                                                                                 |
| Tottori   |           2 | Tottori,Yonago                                                                                                                                                                             |
| Toyama    |           2 | Toyama,Takaoka                                                                                                                                                                             |
| Akita     |           1 | Akita                                                                                                                                                                                      |
| Fukui     |           1 | Fukui                                                                                                                                                                                      |
| Iwate     |           1 | Morioka                                                                                                                                                                                    |
| Kagawa    |           1 | Takamatsu                                                                                                                                                                                  |
| Kagoshima |           1 | Kagoshima                                                                                                                                                                                  |
| Kochi     |           1 | Kochi                                                                                                                                                                                      |
| Saga      |           1 | Saga                                                                                                                                                                                       |
| Shimane   |           1 | Matsue                                                                                                                                                                                     |
| Tokushima |           1 | Tokushima                                                                                                                                                                                  |
| Wakayama  |           1 | Wakayama                                                                                                                                                                                   |
| Yamanashi |           1 | Kofu                                                                                                                                                                                       |
+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
47 rows in set (0.00 sec)

GROUP_CONCAT + ORDER BY を試す

GROUP_CONCAT は関数内部での ORDER BY をサポートしているため,以下のように SQL を書くと連結した文字列を並び替えることができる.

SELECT District, COUNT(Name), GROUP_CONCAT(Name ORDER BY Name)
FROM city
WHERE CountryCode = 'JPN'
GROUP BY District
ORDER BY COUNT(Name) DESC;

今回は「日本の都市名」を昇順に並び替えている.

mysql> SELECT District, COUNT(Name), GROUP_CONCAT(Name ORDER BY Name)
    -> FROM city
    -> WHERE CountryCode = 'JPN'
    -> GROUP BY District
    -> ORDER BY COUNT(Name) DESC;
+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| District  | COUNT(Name) | GROUP_CONCAT(Name ORDER BY Name)                                                                                                                                                           |
+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Osaka     |          22 | Daito,Habikino,Higashiosaka,Hirakata,Ibaraki,Ikeda,Izumi,Izumisano,Kadoma,Kawachinagano,Kishiwada,Matsubara,Minoo,Moriguchi,Neyagawa,Osaka,Sakai,Suita,Takatsuki,Tondabayashi,Toyonaka,Yao |
| Saitama   |          21 | Ageo,Asaka,Fujimi,Fukaya,Higashimatsuyama,Iruma,Iwatsuki,Kasukabe,Kawagoe,Kawaguchi,Koshigaya,Kumagaya,Misato,Niiza,Omiya,Sakado,Sayama,Soka,Toda,Tokorozawa,Urawa                         |
| Chiba     |          19 | Abiko,Chiba,Funabashi,Ichihara,Ichikawa,Kamagaya,Kashiwa,Kimitsu,Kisarazu,Matsudo,Mobara,Nagareyama,Narashino,Narita,Nishio,Noda,Sakura,Urayasu,Yachiyo                                    |
| Tokyo-to  |          18 | Akishima,Chofu,Fuchu,Hachioji,Higashikurume,Higashimurayama,Hino,Hitachinaka,Hoya,Kodaira,Koganei,Kokubunji,Machida,Mitaka,Musashino,Ome,Tachikawa,Tokyo                                   |
| Aichi     |          15 | Anjo,Handa,Ichinomiya,Inazawa,Kariya,Kasugai,Komaki,Konan,Nagoya,Okazaki,Seto,Tokai,Toyohashi,Toyokawa,Toyota                                                                              |
| Kanagawa  |          15 | Atsugi,Chigasaki,Ebina,Fujisawa,Hadano,Hiratsuka,Isehara,Jokohama [Yokohama],Kamakura,Kawasaki,Odawara,Sagamihara,Yamato,Yokosuka,Zama                                                     |
| Hyogo     |          11 | Akashi,Amagasaki,Himeji,Itami,Kakogawa,Kawanishi,Kobe,Nishinomiya,Sanda,Takarazuka,Takasago                                                                                                |
| Hokkaido  |          10 | Asahikawa,Ebetsu,Hakodate,Kitami,Kushiro,Muroran,Obihiro,Otaru,Sapporo,Tomakomai                                                                                                           |
| Shizuoka  |           9 | Fuji,Fujieda,Fujinomiya,Hamamatsu,Mishima,Numazu,Shimizu,Shizuoka,Yaizu                                                                                                                    |
| Mie       |           6 | Ise,Kuwana,Matsusaka,Suzuka,Tsu,Yokkaichi                                                                                                                                                  |
| Yamaguchi |           6 | Hofu,Iwakuni,Shimonoseki,Tokuyama,Ube,Yamaguchi                                                                                                                                            |
| Fukuoka   |           5 | Fukuoka,Kasuga,Kitakyushu,Kurume,Omuta                                                                                                                                                     |
| Gumma     |           5 | Isesaki,Kiryu,Maebashi,Ota,Takasaki                                                                                                                                                        |
| Hiroshima |           5 | Fukuyama,Higashihiroshima,Hiroshima,Kure,Onomichi                                                                                                                                          |
| Ibaragi   |           5 | Hitachi,Mito,Tama,Tsuchiura,Tsukuba                                                                                                                                                        |
| Fukushima |           4 | Aizuwakamatsu,Fukushima,Iwaki,Koriyama                                                                                                                                                     |
| Gifu      |           4 | Gifu,Kakamigahara,Ogaki,Tajimi                                                                                                                                                             |
| Kyoto     |           4 | Kameoka,Kioto,Maizuru,Uji                                                                                                                                                                  |
| Nagano    |           4 | Iida,Matsumoto,Nagano,Ueda                                                                                                                                                                 |
| Nara      |           4 | Ikoma,Kashihara,Nara,Yamatokoriyama                                                                                                                                                        |
| Niigata   |           4 | Joetsu,Kashiwazaki,Nagaoka,Niigata                                                                                                                                                         |
| Tochigi   |           4 | Ashikaga,Kanuma,Oyama,Utsunomiya                                                                                                                                                           |
| Yamagata  |           4 | Sakata,Tsuruoka,Yamagata,Yonezawa                                                                                                                                                          |
| Aomori    |           3 | Aomori,Hachinohe,Hirosaki                                                                                                                                                                  |
| Ehime     |           3 | Imabari,Matsuyama,Niihama                                                                                                                                                                  |
| Miyazaki  |           3 | Miyakonojo,Miyazaki,Nobeoka                                                                                                                                                                |
| Nagasaki  |           3 | Isahaya,Nagasaki,Sasebo                                                                                                                                                                    |
| Okayama   |           3 | Kurashiki,Okayama,Tsuyama                                                                                                                                                                  |
| Okinawa   |           3 | Naha,Okinawa,Urasoe                                                                                                                                                                        |
| Shiga     |           3 | Hikone,Kusatsu,Otsu                                                                                                                                                                        |
| Ishikawa  |           2 | Kanazawa,Komatsu                                                                                                                                                                           |
| Kumamoto  |           2 | Kumamoto,Yatsushiro                                                                                                                                                                        |
| Miyagi    |           2 | Ishinomaki,Sendai                                                                                                                                                                          |
| Oita      |           2 | Beppu,Oita                                                                                                                                                                                 |
| Tottori   |           2 | Tottori,Yonago                                                                                                                                                                             |
| Toyama    |           2 | Takaoka,Toyama                                                                                                                                                                             |
| Akita     |           1 | Akita                                                                                                                                                                                      |
| Fukui     |           1 | Fukui                                                                                                                                                                                      |
| Iwate     |           1 | Morioka                                                                                                                                                                                    |
| Kagawa    |           1 | Takamatsu                                                                                                                                                                                  |
| Kagoshima |           1 | Kagoshima                                                                                                                                                                                  |
| Kochi     |           1 | Kochi                                                                                                                                                                                      |
| Saga      |           1 | Saga                                                                                                                                                                                       |
| Shimane   |           1 | Matsue                                                                                                                                                                                     |
| Tokushima |           1 | Tokushima                                                                                                                                                                                  |
| Wakayama  |           1 | Wakayama                                                                                                                                                                                   |
| Yamanashi |           1 | Kofu                                                                                                                                                                                       |
+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
47 rows in set (0.00 sec)

GROUP_CONCAT + DISTINCT を試す

次にデータの重複を考える.以下の SQL だと「地域名」が,例えば Caribbean,Caribbean,Caribbean のように重複してしまう.

SELECT Continent, GROUP_CONCAT(Region)
FROM country
GROUP BY Continent;

GROUP_CONCAT は関数内部での DISTINCT をサポートしているため,以下のように SQL を書くと,データの重複を除外することができる.

SELECT Continent, GROUP_CONCAT(DISTINCT Region)
FROM country
GROUP BY Continent;

実際に「地域名」の重複を除外できている.

mysql> SELECT Continent, GROUP_CONCAT(DISTINCT Region)
    -> FROM country
    -> GROUP BY Continent;
+---------------+-------------------------------------------------------------------------------------------------+
| Continent     | GROUP_CONCAT(DISTINCT Region)                                                                   |
+---------------+-------------------------------------------------------------------------------------------------+
| Asia          | Eastern Asia,Middle East,Southeast Asia,Southern and Central Asia                               |
| Europe        | Baltic Countries,British Islands,Eastern Europe,Nordic Countries,Southern Europe,Western Europe |
| North America | Caribbean,Central America,North America                                                         |
| Africa        | Central Africa,Eastern Africa,Northern Africa,Southern Africa,Western Africa                    |
| Oceania       | Australia and New Zealand,Melanesia,Micronesia,Micronesia/Caribbean,Polynesia                   |
| Antarctica    | Antarctica                                                                                      |
| South America | South America                                                                                   |
+---------------+-------------------------------------------------------------------------------------------------+
7 rows in set (0.00 sec)

GROUP_CONCAT + DISTINCT + SEPARATOR を試す

GROUP_CONCAT のデフォルト区切り文字は , になっている.データに , が入っている可能性がある場合など,意図的に区切り文字を変更する場合は SEPARATOR を設定する.

SELECT Continent, GROUP_CONCAT(DISTINCT Region SEPARATOR ' ? ')
FROM country
GROUP BY Continent;

以下は区切り文字を ? にして SQL を実行している.

mysql> SELECT Continent, GROUP_CONCAT(DISTINCT Region SEPARATOR ' ? ')
    -> FROM country
    -> GROUP BY Continent;
+---------------+-----------------------------------------------------------------------------------------------------------+
| Continent     | GROUP_CONCAT(DISTINCT Region SEPARATOR ' ? ')                                                             |
+---------------+-----------------------------------------------------------------------------------------------------------+
| Asia          | Eastern Asia ? Middle East ? Southeast Asia ? Southern and Central Asia                                   |
| Europe        | Baltic Countries ? British Islands ? Eastern Europe ? Nordic Countries ? Southern Europe ? Western Europe |
| North America | Caribbean ? Central America ? North America                                                               |
| Africa        | Central Africa ? Eastern Africa ? Northern Africa ? Southern Africa ? Western Africa                      |
| Oceania       | Australia and New Zealand ? Melanesia ? Micronesia ? Micronesia/Caribbean ? Polynesia                     |
| Antarctica    | Antarctica                                                                                                |
| South America | South America                                                                                             |
+---------------+-----------------------------------------------------------------------------------------------------------+
7 rows in set (0.00 sec)

group_concat_max_len システム変数

MySQL の group_concat_max_len システム変数は GROUP_CONCAT が返す連結した文字列の最大バイト数を意味している.デフォルトは「1024」で,最小値は「4」を設定することができる.

実際に SHOW VARIABLES で確認すると「1024」になっていることを確認できる.

mysql> SHOW VARIABLES LIKE 'group_concat_max_len';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| group_concat_max_len | 1024  |
+----------------------+-------+
1 row in set (0.01 sec)

今回は意図的に最小値「4」に設定すると,GROUP_CONCAT の連結した文字列を「4」バイトに制限できる.

mysql> SET SESSION group_concat_max_len = 4;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT Continent, GROUP_CONCAT(DISTINCT Region)
    -> FROM country
    -> GROUP BY Continent;
+---------------+-------------------------------+
| Continent     | GROUP_CONCAT(DISTINCT Region) |
+---------------+-------------------------------+
| Asia          | East                          |
| Europe        | Balt                          |
| North America | Cari                          |
| Africa        | Cent                          |
| Oceania       | Aust                          |
| Antarctica    | Anta                          |
| South America | Sout                          |
+---------------+-------------------------------+
7 rows in set, 7 warnings (0.00 sec)

まとめ

  • MySQL を使う場合 GROUP BY だけではなく GROUP_CONCAT も知っておくと便利
  • GROUP_CONCAT は関数内部で ORDER BYDISTINCTSEPARATOR をサポートしている
  • GROUP_CONCAT の結果列のバイト数を調整する場合には,MySQL のシステム変数 group_concat_max_len を設定する