コンマ区切りリストとしてのMySQL結果


129

次のようなクエリを実行する必要があります。

SELECT p.id, p.name, 
       (SELECT name 
          FROM sites s 
         WHERE s.id = p.site_id) AS site_list
  FROM publications p

ただし、副選択で、データの列ではなく、コンマ区切りのリストを返すようにしたい これは可能ですか?可能な場合、どのように?

回答:


250

GROUP_CONCATを使用してそれを実行できます。

SELECT p.id, p.name, GROUP_CONCAT(s.name) AS site_list
FROM sites s
INNER JOIN publications p ON(s.id = p.site_id)
GROUP BY p.id, p.name;

10
また、PHPMyAdminを使用していて、ページにカンマ区切りのリストを出力したい場合は、GROUP_CONCAT(CAST(s.name AS CHAR))またはを使用すると、のようなまったく役に立たないものが返されます[BLOB - 20 Bytes]
devios1 2012年

3
インテントは問題なく、MySQLはこれを許可しますが、GROUP BYの使用には(通常)注意してください。選択リストの項目は、GROUP BY句のコンテキストで有効な集計である必要があります。この場合、p.nameは厳密には有効ではありません。SQL標準に準拠しているデータベースは、これをエラーとして扱います。この場合、選択リストでMAX(p.name)を使用するか、p.nameをGROUP BY句に追加します。Paulは主キーまたは一意のキーを表すためにp.idを意味するため、GROUP BY句にp.nameを追加しても、最終的な結果には影響しません。
ジョンアームストロング-Xgc 2012年


どうもありがとう!あなたは私をたくさん助けてくれました!
アンドレ・アゴスチーニョ

11

使用group concat()する代わりに、単に使用することができますconcat()

Select concat(Col1, ',', Col2) as Foo_Bar from Table1;

これを編集すると、mySQLでのみ機能します。Oracle concatは2つの引数のみを受け入れます。Oracleでは、select col1 || '、' || col2 || '、' || col3のようなものをtable1のfoobarとして使用できます。SQLサーバーでは、パイプの代わりに+を使用します。


2
これはGROUP BYの場合は機能しませんが、GROUP_CONCAT()は単一の列の内容を連結します
Aram Paronikyan

5

今、私だけがこの状況に遭遇し、周りにいくつかのより興味深い機能を見つけました GROUP_CONCAT。これらの詳細があなたを面白く感じることを願っています。

単純なGROUP_CONCAT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

結果:

+------------------------------------------------------------------+
| GROUP_CONCAT(TaskName)                                           |
+------------------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats |
+------------------------------------------------------------------+

DISTINCTを含むGROUP_CONCAT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

結果:

+------------------------------------------------------------------+
| GROUP_CONCAT(TaskName)                                           |
+------------------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats |
+------------------------------------------------------------------+

DISTINCTおよびORDER BYを指定したGROUP_CONCAT

SELECT GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) 
FROM Tasks;

結果:

+--------------------------------------------------------+
| GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) |
+--------------------------------------------------------+
| Take dog for walk,Relax,Paint roof,Feed cats,Do garden |
+--------------------------------------------------------+

DISTINCTおよびSEPARATORを含むGROUP_CONCAT

SELECT GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ') 
FROM Tasks;

結果:

+----------------------------------------------------------------+
| GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ')                |
+----------------------------------------------------------------+
| Do garden + Feed cats + Paint roof + Relax + Take dog for walk |
+----------------------------------------------------------------+

GROUP_CONCATと結合列

SELECT GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ') 
FROM Tasks;

結果:

+------------------------------------------------------------------------------------+
| GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ')                                 |
+------------------------------------------------------------------------------------+
| 1) Do garden 2) Feed cats 3) Paint roof 4) Take dog for walk 5) Relax 6) Feed cats |
+------------------------------------------------------------------------------------+

GROUP_CONCATとグループ化された結果 以下を使用する前の結果であると仮定します。GROUP_CONCAT

+------------------------+--------------------------+
| ArtistName             | AlbumName                |
+------------------------+--------------------------+
| Iron Maiden            | Powerslave               |
| AC/DC                  | Powerage                 |
| Jim Reeves             | Singing Down the Lane    |
| Devin Townsend         | Ziltoid the Omniscient   |
| Devin Townsend         | Casualties of Cool       |
| Devin Townsend         | Epicloud                 |
| Iron Maiden            | Somewhere in Time        |
| Iron Maiden            | Piece of Mind            |
| Iron Maiden            | Killers                  |
| Iron Maiden            | No Prayer for the Dying  |
| The Script             | No Sound Without Silence |
| Buddy Rich             | Big Swing Face           |
| Michael Learns to Rock | Blue Night               |
| Michael Learns to Rock | Eternity                 |
| Michael Learns to Rock | Scandinavia              |
| Tom Jones              | Long Lost Suitcase       |
| Tom Jones              | Praise and Blame         |
| Tom Jones              | Along Came Jones         |
| Allan Holdsworth       | All Night Wrong          |
| Allan Holdsworth       | The Sixteen Men of Tain  |
+------------------------+--------------------------+
USE Music;
SELECT ar.ArtistName,
    GROUP_CONCAT(al.AlbumName)
FROM Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId
GROUP BY ArtistName;

結果:

+------------------------+----------------------------------------------------------------------------+
| ArtistName             | GROUP_CONCAT(al.AlbumName)                                                 |
+------------------------+----------------------------------------------------------------------------+
| AC/DC                  | Powerage                                                                   |
| Allan Holdsworth       | All Night Wrong,The Sixteen Men of Tain                                    |
| Buddy Rich             | Big Swing Face                                                             |
| Devin Townsend         | Epicloud,Ziltoid the Omniscient,Casualties of Cool                         |
| Iron Maiden            | Somewhere in Time,Piece of Mind,Powerslave,Killers,No Prayer for the Dying |
| Jim Reeves             | Singing Down the Lane                                                      |
| Michael Learns to Rock | Eternity,Scandinavia,Blue Night                                            |
| The Script             | No Sound Without Silence                                                   |
| Tom Jones              | Long Lost Suitcase,Praise and Blame,Along Came Jones                       |
+------------------------+----------------------------------------------------------------------------+

3

私の場合、携帯電話番号が一意である人のアカウント番号をすべて連結する必要があります。だから私はそれを達成するために次のクエリを使用しました。

SELECT GROUP_CONCAT(AccountsNo) as Accounts FROM `tblaccounts` GROUP BY MobileNumber

クエリ結果は以下のとおりです。

Accounts
93348001,97530801,93348001,97530801
89663501
62630701
6227895144840002
60070021
60070020
60070019
60070018
60070017
60070016
60070015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.