带有 WHERE 子句的多个“GROUP_CONCAT”

Goo*_*bot 6 mysql select group-by group-concatenation

在表中作为

id    name      type           info
1     BMW       car            yes
2     Reno      car            no
3     IBM       electronics    no
4     Sony      electronics    yes
5     Mazda     car            yes
Run Code Online (Sandbox Code Playgroud)

GROUP_CONCAT用来获取每个的列表type,但我想将连接的列分隔为按列分类的多个列info。它应该是这样的

SELECT type,
       GROUP_CONCAT(name) ORDER BY id ASC SEPARATOR ' ') AS list_with_info
       GROUP_CONCAT(name) ORDER BY id ASC SEPARATOR ' ') AS list_without_info
       FROM table1 GROUP BY type
Run Code Online (Sandbox Code Playgroud)

如何引入WHERE子句或使用其他方法返回多个连接列?

ype*_*eᵀᴹ 12

SELECT type,
       GROUP_CONCAT( CASE WHEN info = 'yes' THEN name ELSE NULL END 
                     ORDER BY id ASC SEPARATOR ' ') AS list_with_info,
       GROUP_CONCAT( CASE WHEN info = 'no' THEN name ELSE NULL END 
                     ORDER BY id ASC SEPARATOR ' ') AS list_without_info      
FROM table1
GROUP BY type ;
Run Code Online (Sandbox Code Playgroud)

在 SQL-Fiddle测试test-1


如果你想要两行而不是一行的结果,那就更容易了,只需要GROUP BY两行type, info

SELECT 
    type, info,
    GROUP_CONCAT( name ORDER BY id ASC SEPARATOR ' ')
      AS list     
FROM table1
GROUP BY type
       , info ;
Run Code Online (Sandbox Code Playgroud)

这也可用于提供您想要的每类型一行格式:

SELECT
    type,
    MIN( CASE WHEN info = 'yes' THEN list END )
      AS list_with_info,
    MIN( CASE WHEN info = 'no' THEN list END )
      AS list_without_info    
FROM
    ( SELECT 
          type, info,
          GROUP_CONCAT( name ORDER BY id ASC SEPARATOR ' ')
            AS list     
      FROM table1
      GROUP BY type
             , info 
    ) AS grp 
GROUP BY type ;
Run Code Online (Sandbox Code Playgroud)

在 SQL-Fiddle测试test-2

上述两个查询将受益于索引 (type, info, name)


以下将受益于 上的索引(info, type, name)

SELECT
    dt.type,
    grpy.list  AS list_with_info,
    grpn.list  AS list_without_info    
FROM
    ( SELECT DISTINCT type
      FROM table1
    ) AS dt
  LEFT JOIN
    ( SELECT 
          type,
          GROUP_CONCAT( name ORDER BY id ASC SEPARATOR ' ')
            AS list     
      FROM table1
      WHERE info = 'yes'
      GROUP BY type 
    ) AS grpy
      ON grpy.type = dt.type
  LEFT JOIN
    ( SELECT 
          type,
          GROUP_CONCAT( name ORDER BY id ASC SEPARATOR ' ')
            AS list     
      FROM table1
      WHERE info = 'no'
      GROUP BY type 
    ) AS grpn
      ON grpn.type = dt.type ;
Run Code Online (Sandbox Code Playgroud)

在 SQL-Fiddle测试test-3