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)
如果你想要两行而不是一行的结果,那就更容易了,只需要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)
上述两个查询将受益于索引 (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)
归档时间: |
|
查看次数: |
42039 次 |
最近记录: |