MySQLのGROUP_CONCAT()で列の値をグループ連結し、条件を指定してレコードを表示する方法
MySQLのGROUP_CONCAT()関数とは
MySQLでは、GROUP_CONCAT()関数を使用することで、複数の行に分かれている列の値を1つの文字列としてグループ連結できます。さらにWHERE句で条件を指定すれば、対象となるレコードを絞り込んだ上で連結結果を取得することも可能です。
本記事では、実際にテーブルを作成し、データを挿入したうえで、条件付きのグループ連結を実行する手順を解説します。
1. テーブルを作成する
まず、サンプル用のテーブル「DemoTable813」を作成します。
mysql> create table DemoTable813(
UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
UserFirstName varchar(100),
UserLastName varchar(100)
);
Query OK, 0 rows affected (0.49 sec)
このテーブルには、ユーザーID(自動採番の主キー)、名(UserFirstName)、姓(UserLastName)の3つの列が定義されています。
2. レコードを挿入する
次に、INSERTコマンドを使ってレコードを登録していきます。
mysql> insert into DemoTable813(UserFirstName,UserLastName) values('Adam','Smith');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable813(UserFirstName,UserLastName) values('Chris','Brown');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable813(UserFirstName,UserLastName) values('David','Miller');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable813(UserFirstName,UserLastName) values('Carol','Taylor');
Query OK, 1 row affected (0.22 sec)
3. 登録されたデータを確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable813;
実行結果は以下の通りです。
+--------+---------------+--------------+ | UserId | UserFirstName | UserLastName | +--------+---------------+--------------+ | 1 | Adam | Smith | | 2 | Chris | Brown | | 3 | David | Miller | | 4 | Carol | Taylor | +--------+---------------+--------------+ 4 rows in set (0.00 sec)
4. GROUP_CONCAT()とWHERE句で条件付き連結を行う
ここからが本題です。GROUP_CONCAT()を使って姓(UserLastName)を連結しつつ、WHERE句で「UserIdが4未満」という条件を指定すると、該当するレコードだけが連結対象になります。
mysql> select group_concat(UserLastName) from DemoTable813 where UserId < 4;
実行結果は以下の通りです。
+----------------------------+ | group_concat(UserLastName) | +----------------------------+ | Smith,Brown,Miller | +----------------------------+ 1 row in set (0.00 sec)
ご覧のとおり、UserIdが1〜3のレコードに該当する「Smith」「Brown」「Miller」という3つの姓が、カンマ区切りの1つの文字列として出力されました。UserIdが4の「Taylor」は条件外のため除外されています。
まとめ
- GROUP_CONCAT()を使うと、複数行の列の値を1つの文字列に連結できる。
- WHERE句と組み合わせることで、連結対象のレコードを柔軟に絞り込める。
- デフォルトではカンマ区切りで出力されるため、リスト形式のデータ生成などに便利。
区切り文字を変更したい場合はSEPARATOR句を、並び順を指定したい場合はORDER BY句をGROUP_CONCAT()内で使用できるので、用途に応じて活用してください。
-
MySQLで現在の日付と翌日のレコードを条件に特定の列を抽出する方法
MySQLでは、CURDATE()関数を使うことで、現在の日付やその翌日に該当するレコードを簡単に抽出できます。この記事では、実際のサンプルを使いながら、現在の日付と翌日の出荷日を持つレコードから特定の列を選択して取得する方法を解説します。 1. 現在の日付を確認する まず、curdate()関数で現在の日付を取得してみましょう。 mysql> select curdate(); 実行すると、以下のような結果が表示されます。 +------------+ | curdate() | +------------+ | 2019-12-15 | +------------+ 1 row
-
MySQLでテーブルを更新し、新しい列に名前のイニシャルを表示する方法
MySQLでは、LEFT()関数とSUBSTRING_INDEX()関数を組み合わせることで、氏名からイニシャル(頭文字)だけを取り出すことができます。この記事では、実際にテーブルを作成し、既存のデータからイニシャルを生成して新しい列に格納する手順を解説します。 1. テーブルの作成 まず、氏名を保存する「full_name」列と、イニシャルを格納する「short_name」列を持つテーブルを作成しましょう。 mysql> create table demo13 -> ( -> full_name varchar(100), -> short_name varchar