MySQLのGROUP_CONCATで連番を実装する方法
MySQLでは、GROUP_CONCAT()とユーザー定義変数を組み合わせることで、グループごとに連番を付けた文字列を生成できます。この記事では、姓(LastName)ごとに名前(FirstName)へ連番を付けて結合する方法を、具体的な手順とともに解説します。
1. サンプルテーブルの作成
まず、以下のコマンドでテーブルを作成します。
mysql> create table DemoTable1627
-> (
-> FirstName varchar(20),
-> LastName varchar(20)
-> );
Query OK, 0 rows affected (0.59 sec)2. レコードの挿入
次に、INSERTコマンドを使ってテーブルにレコードを挿入します。
mysql> insert into DemoTable1627 values('John','Smith');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1627 values('John','Doe');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1627 values('Adam','Smith');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1627 values('Carol','Taylor');
Query OK, 1 row affected (0.08 sec)3. テーブルの内容を確認
SELECT文でテーブル内のすべてのレコードを表示してみましょう。
mysql> select * from DemoTable1627;
実行結果は以下のとおりです。
+-----------+----------+ | FirstName | LastName | +-----------+----------+ | John | Smith | | John | Doe | | Adam | Smith | | Carol | Taylor | +-----------+----------+ 4 rows in set (0.00 sec)
4. GROUP_CONCATで連番を付けるクエリ
ここが本題です。ユーザー定義変数@pと@jを使い、同じ姓が続く限りカウンターを増やし、姓が変わった時点で1にリセットすることで、グループ内の連番を実現しています。
mysql> select LastName,
-> group_concat(
-> concat(@j := if (@p = LastName, @j + 1, if(@p := LastName,1,1)), '.', FirstName)
-> separator ', ') FirstName
-> from DemoTable1627
-> group by LastName;実行結果は以下のとおりです。
+----------+----------------+ | LastName | FirstName | +----------+----------------+ | Doe | 1.John | | Smith | 1.John, 2.Adam | | Taylor | 1.Carol | +----------+----------------+ 3 rows in set (0.09 sec)
クエリの仕組みのポイント
- @p(前回の姓を保持する変数):現在の行の姓と比較するために使われます。
- @j(連番カウンター):姓が同じであれば
@j + 1でインクリメントし、異なる場合は1にリセットされます。 - GROUP_CONCAT:連番と名前を
.で連結した文字列を、,区切りで1つの文字列にまとめます。
このように、ユーザー定義変数とGROUP_CONCATを組み合わせれば、GROUP BYでグループ化した各グループ内に連番を振った集約結果を簡単に作成できます。なお、MySQL 8.0以降ではROW_NUMBER()などのウィンドウ関数も利用できるため、より読みやすいクエリで同様の結果を得ることも可能です。
-
MySQLで調和平均と二乗平均(Quadratic Mean)を計算する方法
MySQLには調和平均(Harmonic Mean)や二乗平均(Quadratic Mean)を直接求める組み込み関数は用意されていませんが、COUNT()、SUM()、SQRT()といった基本的な集計関数・数学関数を組み合わせることで、簡単に実装できます。サンプルテーブルの作成まず、以下のようにテーブルを作成します。mysql> create table DemoTable1606 -> ( -> Value int -> );Query OK, 0 rows affected (0.55 sec)レコードの挿入INSERTコマンドを使って、テーブル
-
MySQLでDOUBLE型の桁数(長さ)を実装・設定する方法
MySQLでDOUBLE型のカラムを作成する場合、以下のような構文を使用します。create table yourTableName ( yourColumnName double(5,2) unsigned );DOUBLE型の構文についてdouble(5,2) の「5」は整数部と小数部を合わせた全体の桁数、「2」は小数点以下の桁数を表します。つまり、この設定では最大で 999.99 までの値を格納できます。さらに、unsigned を指定すると負の値が除外され、正の数値のみを扱うカラムになります。テーブルの作成まず、実際にテーブルを作成してみましょう。mysql> create ta