MySQL GROUP_CONCAT带分隔符

时间:2015-10-04 07:24:02

标签: mysql

假设我有一个表'pincodes'为

-------------------------------------
| id  | name  |  parent_id  | value |
-------------------------------------
|  1  | State |     0       |   0   |
|  2  | City1 |     1       | 20220 |
|  3  | City2 |     1       | 20221 |

我需要的结果是

--------------------------
| 1 | State       |      |
| 2 | State>City1 | 20220|
| 3 | State>City2 | 20221|
--------------------------

我尝试了什么

SELECT id,
   GROUP_CONCAT(name ORDER BY parent_id SEPARATOR ' > ') AS name
FROM pincode
GROUP BY id ORDER BY name;

以上查询的结果是

--------------------
| 1 | State |      |
| 2 | City1 | 20220|
| 3 | City2 | 20221|
--------------------

我需要的是父状态应该附加到每个城市。

  

注意:任何人都可以提出更好的问题标题。

1 个答案:

答案 0 :(得分:2)

您可以使用以下查询:

SELECT p1.id, CONCAT(COALESCE(CONCAT(p2.name, '>'), ''),  p1.name), p1.value
FROM pincodes AS p1
LEFT JOIN pincodes AS p2 ON p1.parent_id = p2.id
ORDER BY p1.id

您可以使用LEFT JOIN获取父记录。使用CONCAT函数,您可以将父级的名称与子级名称连接起来。

Demo here

编辑:

以上查询仅适用于2级层次结构。对于其他级别,您必须使用其他LEFT JOIN操作。对于通用解决方案,必须使用MySQL中不可用的递归CTE。

以上查询可以扩展为处理3级层次结构的方式:

SELECT p1.id, 
       CONCAT(COALESCE(CONCAT(p3.name, '>'), ''),
              COALESCE(CONCAT(p2.name, '>'), ''),  
              p1.name), 
       p1.value
FROM pincodes AS p1
LEFT JOIN pincodes AS p2 ON p1.parent_id = p2.id
LEFT JOIN pincodes AS p3 ON p2.parent_id = p3.id
ORDER BY p1.id

Demo here