MySQLでCONCAT()とGROUP_CONCAT()を同じクエリで組み合わせて文字列を連結する方法
MySQLには文字列を連結するための関数が2種類用意されています。CONCAT()は指定した複数の文字列をそのまま連結する関数であり、一方GROUP_CONCAT()は、グループ化された行の値をまとめて1つの文字列に連結する集計関数です。この2つを同じクエリの中で組み合わせることで、「各グループ内の複数の値に対して個別の加工を行い、それらをさらに1つの文字列にまとめる」という処理を簡潔に実現できます。
この記事では、実際にサンプルテーブルを作成し、CONCAT()とGROUP_CONCAT()を組み合わせたクエリの動作を確認していきます。
サンプルテーブルの作成
まず、以下のコマンドでテーブルを作成します。
mysql> create table DemoTable799 ( UserId int, UserName varchar(100), UserAge int ); Query OK, 0 rows affected (0.56 sec)
レコードの挿入
次に、INSERTコマンドを使っていくつかのレコードを挿入します。ここでは、同じUserIdを持つ複数のユーザー名を登録しておくのがポイントです。
mysql> insert into DemoTable799 values(101,'John',21); Query OK, 1 row affected (0.18 sec) mysql> insert into DemoTable799 values(102,'Chris',26); Query OK, 1 row affected (0.22 sec) mysql> insert into DemoTable799 values(101,'Robert',23); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable799 values(103,'David',24); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable799 values(101,'Mike',29); Query OK, 1 row affected (0.18 sec)
登録済みレコードの確認
SELECT文でテーブル内の全レコードを表示してみましょう。
mysql> select *from DemoTable799;
実行すると、次のような結果が出力されます。
+--------+----------+---------+ | UserId | UserName | UserAge | +--------+----------+---------+ | 101 | John | 21 | | 102 | Chris | 26 | | 101 | Robert | 23 | | 103 | David | 24 | | 101 | Mike | 29 | +--------+----------+---------+ 5 rows in set (0.00 sec)
CONCAT()とGROUP_CONCAT()を組み合わせたクエリ
それでは本題です。UserIdごとにグループ化し、各ユーザー名の先頭に「MR.」を付けて連結するクエリを実行します。
mysql> select UserId,GROUP_CONCAT(CONCAT('MR.', UserName)) from DemoTable799 group by UserId;実行結果は以下の通りです。
+--------+---------------------------------------+
| UserId | GROUP_CONCAT(CONCAT('MR.', UserName)) |
+--------+---------------------------------------+
| 101 | MR.John,MR.Robert,MR.Mike |
| 102 | MR.Chris |
| 103 | MR.David |
+--------+---------------------------------------+
3 rows in set (0.00 sec)結果のポイント
- 内側のCONCAT('MR.', UserName): 各行のUserNameに対して「MR.」という接頭辞を付加します。
- 外側のGROUP_CONCAT(...): UserIdごとにグループ化された各行の結果を、カンマ区切りの1つの文字列にまとめます。
このように、まず各行単位で文字列を加工し(CONCAT)、その結果をグループ単位で集約する(GROUP_CONCAT)という流れになります。なお、連結時の区切り文字を変更したい場合は、GROUP_CONCAT(CONCAT('MR.', UserName) SEPARATOR ' / ')のようにSEPARATOR句を指定することも可能です。
-
MySQLのGROUP_CONCAT・CONCAT・DISTINCTを使って単一カラムの値を引用符で囲む方法
MySQLで単一カラム内のカンマ区切りの値を、それぞれ引用符(シングルクォート)で囲んだ形式に変換したい場合は、GROUP_CONCAT()とREPLACE()、さらにCONCAT()を組み合わせることで実現できます。ここでは、実際の例を使って手順を詳しく解説します。 テーブルの作成 まずはサンプルとなるテーブルを作成しましょう。 mysql> create table DemoTable1799 ( EmployeeId varchar(20) ); Query OK, 0 rows affected
-
TensorFlowとPythonで同じ長さの複数の文字列をエンコードする方法
同じ長さの複数の文字列をエンコードする場合は、tf.Tensorを入力値として使用できます。一方、長さが異なる複数の文字列をエンコードする必要がある場合には、tf.RaggedTensorを入力として使うことが推奨されます。また、パディング(padded)形式やスパース(sparse)形式で複数の文字列を含むテンソルがある場合は、まずそれをtf.RaggedTensorに変換してから、unicode_encodeメソッドを呼び出す必要があります。Unicode文字列の操作についてここでは、Pythonを使ってUnicode文字列をどのように表現し、Unicodeの同等機能を利用してそれらを操作