MySQLで特定の列の値(1)に基づいてGROUP_CONCAT()を使い、複数行のデータを1行にまとめる方法
MySQLでは、GROUP_CONCAT()関数とWHERE句を組み合わせることで、特定の条件に一致する複数行のデータを1行に連結して取得できます。ここでは、ステータスが「1」であるプレイヤー名だけを抽出し、カンマ区切りの1つの文字列として表示する例を紹介します。
サンプルテーブルの作成
まず、プレイヤー名とステータスを格納するテーブルを作成します。
mysql> create table DemoTable
(
PlayerName varchar(40),
PlayerStatus tinyint(1)
);
Query OK, 0 rows affected (0.60 sec)テストデータの挿入
次に、INSERT文を使っていくつかのレコードを挿入します。
mysql> insert into DemoTable values('Chris',1);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('David',0);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Sam',1);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('Carol',1);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Bob',0);
Query OK, 1 row affected (0.14 sec)登録データの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行結果は以下の通りです。
+------------+--------------+ | PlayerName | PlayerStatus | +------------+--------------+ | Chris | 1 | | David | 0 | | Sam | 1 | | Carol | 1 | | Bob | 0 | +------------+--------------+ 5 rows in set (0.00 sec)
GROUP_CONCAT()で条件に一致するデータを1行にまとめる
ここからが本題です。WHERE PlayerStatus=1という条件で絞り込み、該当するプレイヤー名をGROUP_CONCAT()で連結します。
mysql> select group_concat(PlayerName) from DemoTable where PlayerStatus=1;
実行結果は以下の通りです。ステータスが「1」の3件(Chris、Sam、Carol)だけがカンマ区切りで1行に出力されています。
+--------------------------+ | group_concat(PlayerName) | +--------------------------+ | Chris,Sam,Carol | +--------------------------+ 1 row in set (0.00 sec)
補足:区切り文字や並び順を指定する
デフォルトの区切り文字はカンマですが、SEPARATOR句を使えば任意の文字に変更できます。また、ORDER BYを組み合わせれば連結順序も制御可能です。
mysql> select group_concat(PlayerName order by PlayerName separator ' / ')
-> from DemoTable where PlayerStatus=1;このように書くことで、「Carol / Chris / Sam」のように名前順・スラッシュ区切りで出力されます。集計結果をCSV形式でエクスポートしたい場合や、アプリケーション側でタグ一覧などを1文字列として扱いたい場合に非常に便利なテクニックです。
-
MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方
MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829 ( Name varchar(
-
複数行の文字列を1行に結合し、対応するIDの合計も表示するMySQLクエリの書き方
GROUP_CONCAT()とSUM()を組み合わせた集計方法複数行に分かれた文字列を1つの行にまとめて結合し、さらにIDの合計値を別の列として同時に表示したい場合は、GROUP_CONCAT()関数とSUM()関数を組み合わせることで実現できます。ここでは、実際にテーブルを作成し、動作を確認する手順を見ていきましょう。1. サンプルテーブルの作成まず、学生IDと学生名を持つテーブルを作成します。mysql> create table DemoTable1960 ( StudentId int, StudentName varchar(20) ); Que