MySQL结果以逗号分隔列表

Gle*_*rry 115 mysql sql concatenation

我需要运行如下查询:

SELECT p.id, p.name, 
       (SELECT name 
          FROM sites s 
         WHERE s.id = p.site_id) AS site_list
  FROM publications p
Run Code Online (Sandbox Code Playgroud)

但我希望子选择返回逗号分隔列表,而不是一列数据.这是否可能,如果是这样,怎么样?

Pau*_*xon 236

您可以使用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;
Run Code Online (Sandbox Code Playgroud)

  • 另外,请注意,如果您正在使用PHPMyAdmin并希望将逗号分隔的列表输出到页面,请使用`GROUP_CONCAT(CAST(s.name AS CHAR))`否则它将返回完全无用的内容,如`[ BLOB - 20字节]`. (9认同)
  • 意图很好,MySQL会允许这样做,但是(通常)在使用GROUP BY时要小心.选择列表中的项目必须是GROUP BY子句上下文中的有效聚合.在这种情况下,p.name不是严格有效的.任何符合SQL标准的数据库都会将此视为错误.对于这种情况,要么在选择列表中使用MAX(p.name),要么将p.name添加到GROUP BY子句中.由于Paul可能意味着p.id表示主键或唯一键,因此向GROUP BY子句添加p.name将不会影响最终结果. (3认同)

Gan*_*mar 14

现在只有我遇到了这种情况,并发现了一些更有趣的功能GROUP_CONCAT。我希望这些细节会让你觉得有趣。

简单的 GROUP_CONCAT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;
Run Code Online (Sandbox Code Playgroud)

结果:

+------------------------------------------------------------------+
| GROUP_CONCAT(TaskName)                                           |
+------------------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats |
+------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

GROUP_CONCAT 与 DISTINCT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;
Run Code Online (Sandbox Code Playgroud)

结果:

+------------------------------------------------------------------+
| GROUP_CONCAT(TaskName)                                           |
+------------------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats |
+------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

带有 DISTINCT 和 ORDER BY 的 GROUP_CONCAT

SELECT GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) 
FROM Tasks;
Run Code Online (Sandbox Code Playgroud)

结果:

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

带有 DISTINCT 和 SEPARATOR 的 GROUP_CONCAT

SELECT GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ') 
FROM Tasks;
Run Code Online (Sandbox Code Playgroud)

结果:

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

GROUP_CONCAT 和组合列

SELECT GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ') 
FROM Tasks;
Run Code Online (Sandbox Code Playgroud)

结果:

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

GROUP_CONCAT 和 Grouped Results 假设下面是使用前的结果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  |
+------------------------+--------------------------+
Run Code Online (Sandbox Code Playgroud)
USE Music;
SELECT ar.ArtistName,
    GROUP_CONCAT(al.AlbumName)
FROM Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId
GROUP BY ArtistName;
Run Code Online (Sandbox Code Playgroud)

结果:

+------------------------+----------------------------------------------------------------------------+
| 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                       |
+------------------------+----------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)


Rob*_*inn 9

而不是使用group concat()你可以使用concat()

Select concat(Col1, ',', Col2) as Foo_Bar from Table1;
Run Code Online (Sandbox Code Playgroud)

编辑它只适用于mySQL; Oracle concat只接受两个参数.在oracle中,您可以使用select col1 ||','|| col2 ||','|| col3之类的东西作为来自table1的foobar; 在SQL Server中你会使用+而不是管道.

  • 这在GROUP BY的情况下不起作用,而GROUP_CONCAT()将串联单个列的内容 (2认同)