【问题标题】:MySQL Results as comma separated listMySQL 结果为逗号分隔列表
【发布时间】:2010-10-14 07:34:24
【问题描述】:

我需要运行如下查询:

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

但我希望子选择返回一个逗号分隔的列表,而不是一列数据。这甚至可能吗?如果可以,怎么做?

【问题讨论】:

    标签: sql mysql concatenation


    【解决方案1】:

    您可以使用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;
    

    【讨论】:

    • 另外,请注意,如果您正在使用 PHPMyAdmin 并希望将逗号分隔的列表输出到页面,请使用GROUP_CONCAT(CAST(s.name AS CHAR)),否则它将返回完全无用的内容,例如[BLOB - 20 Bytes]
    • 意图很好,MySQL 会允许这样做,但是(通常)小心使用 GROUP BY。选择列表中的项目必须是 GROUP BY 子句上下文中的有效聚合。在这种情况下, p.name 不是严格有效的。任何符合 SQL 标准的数据库都会将此视为错误。对于这种情况,在选择列表中使用 MAX(p.name) 或将 p.name 添加到 GROUP BY 子句。由于 Paul 可能意味着 p.id 表示主键或唯一键,因此将 p.name 添加到 GROUP BY 子句不会对最终结果产生影响。
    • 请注意,您可能必须为每个 stackoverflow.com/questions/2567000/… 设置会话的最大长度
    【解决方案2】:

    您可以只使用concat() 而不是group concat()

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

    edit 这仅适用于 mySQL; Oracle concat 只接受两个参数。在 oracle 中,您可以使用类似 select col1||','||col2||','||col3 as foobar from table1; 在 sql server 中,您将使用 + 而不是管道。

    【讨论】:

    • 这在 GROUP BY 情况下不应该工作,而 GROUP_CONCAT() 将连接单个列的内容
    【解决方案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
    

    【讨论】:

      【解决方案4】:

      现在只有我遇到这种情况,在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 |
      +------------------------------------------------------------------+
      

      GROUP_CONCAT 与 DISTINCT

      SELECT GROUP_CONCAT(TaskName) 
      FROM Tasks;
      

      结果:

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

      GROUP_CONCAT 与 DISTINCT 和 ORDER BY

      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 |
      +--------------------------------------------------------+
      

      GROUP_CONCAT 与 DISTINCT 和 SEPARATOR

      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                       |
      +------------------------+----------------------------------------------------------------------------+
      

      【讨论】:

      • 它的限制可能不超过 65 个结果
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 2013-07-03
      • 2014-04-22
      • 1970-01-01
      • 2018-03-09
      相关资源
      最近更新 更多