MariaDBはGROUP_CONCATの結果を上位N件に制限できる

はじめに

GROUP_CONCATはMySQLやMariaDBでサポートされている集計関数の一つだ。
GROUP BY句で束ねられたデータを、カンマ区切り文字列に変換する仕組みを持つ。

データを加工する前段階に利用したり、視覚的に確認したい場合に使うと便利な機能だ。

ただ、束ねられるデータが増えてくると、出力される件数を制限したいという要求が出てくるものだ。

MySQLのマニュアルには、この件数を制限する方法は載っていないようだ。
ところが、MariaDBの場合は、GROUP_CONCAT関数の引数にLIMIT句が使用可能となっていて、これを適用すれば出力される件数を制限できることに気づいた。

いわゆる上位互換の機能が存在しているようだが、今回はこの内容について紹介することにする。

残念ながらMySQLでは今のところ未実装の機能のようだが、割り切ってMariaDBを使っている場合にはお勧めできる便利な機能となっている。

使用例

以下のようなテーブルがあったとしよう。
名前は仮に「tbalance」としておく。

科目、補助科目別の金額を表すテーブルだ。
サンプルなので内容についてはあまり気にしないでいただきたい。

このような場合に、科目別の補助科目リストや金額リストなどをカンマ区切り文字列で取得できるのが GROUP_CONCAT 関数だ。
例えば、科目別の補助科目リストが必要なら次のような SQL を適用すればよい。

SELECT `科目`, GROUP_CONCAT(`補助科目` ORDER BY `金額` DESC) AS `補助科目リスト`
FROM tbalance
GROUP BY `科目`

すると、以下のような結果が返ってくるだろう。
なお、結果は見やすさのために表形式にして掲示している。

ここで交通費などの結果が複数個になる行を見ると、該当する補助科目がカンマ区切りで並んでいることが分かるだろう。

前置きがやや長くなったが、このリストの出力数を制限したい場合に、MariaDBでは LIMIT 句が適用できるというのが本記事の主旨だ。

一番長い補助科目リストは交通費の行で、ここには6つの要素が含まれているが、これを例えば4件までに制限することを考えよう。

では前述の SQL 文を変更して、以下のように LIMIT 句を追加してみよう。

SELECT 科目, GROUP_CONCAT(補助科目 ORDER BY 金額 DESC LIMIT 4) AS 補助科目リスト
FROM tbalance
GROUP BY 科目

すると、次のような結果が返って来る。

件数を上位4件に絞ったので、交通費の6項目のうち、金額の少ない2件が除外されていることが分かるだろう。
交通費以外の項目には変化がないが、これは元から件数が4件に満たなかったためだ。

以上、MariaDB の GROUP_CONCAT 関数で出力結果を指定した件数に制限したい場合に、LIMIT 句を使用して実現する方法を紹介した。

まとめ

MariaDB の GROUP_CONCAT 関数で、出力件数を制限する方法について紹介した。
残念ながら、今のところ MySQL では使えないようだが、もし割り切って MariaDB を使っている場合にはお勧めの便利な機能となっている。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です