MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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文字列として扱いたい場合に非常に便利なテクニックです。

  1. MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方

    MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829      (      Name varchar(

  2. 複数行の文字列を1行に結合し、対応するIDの合計も表示するMySQLクエリの書き方

    GROUP_CONCAT()とSUM()を組み合わせた集計方法複数行に分かれた文字列を1つの行にまとめて結合し、さらにIDの合計値を別の列として同時に表示したい場合は、GROUP_CONCAT()関数とSUM()関数を組み合わせることで実現できます。ここでは、実際にテーブルを作成し、動作を確認する手順を見ていきましょう。1. サンプルテーブルの作成まず、学生IDと学生名を持つテーブルを作成します。mysql> create table DemoTable1960 ( StudentId int, StudentName varchar(20) ); Que