MySQL组_CONCAT,带分隔符

MySQL组_CONCAT,带分隔符,mysql,Mysql,假设我有一个表“pincodes”作为 ------------------------------------- | id | name | parent_id | value | ------------------------------------- | 1 | State | 0 | 0 | | 2 | City1 | 1 | 20220 | | 3 | City2 | 1 | 20221 | 我

假设我有一个表“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|
--------------------
我需要的是每个城市都应该有一个州

注意:有人能推荐一个更好的问题标题吗


您可以使用以下查询:

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
您可以使用
左联接
获取父记录。使用
CONCAT
函数,您可以将父项的名称与子项的名称连接起来

编辑:

上述查询仅适用于2级层次结构。对于附加级别,您必须使用附加的
左连接
操作。对于通用解决方案,必须使用MySQL中不可用的递归CTE

这就是如何扩展上述查询以处理三级层次结构:

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

您不需要任何聚合。您只需要一个联接。为指定结果,是否希望像
State>City1>Subcity1
那样从根目录生成结果?作者不指定,但将生成
City1>Subcity1
,而不是
State>City1>Subcity1
,可能是递归解决方案needed@lad2025是的,这是正确的。我的查询仅适用于两级层次结构。对于通用解决方案,必须使用MySQL中不可用的递归CTE。@Giorgosbetos感谢SQL FIDLE!这对我有用吗?现在我只使用2级层次结构,所以没有问题