MySQL组_CONCAT,带分隔符
假设我有一个表“pincodes”作为MySQL组_CONCAT,带分隔符,mysql,Mysql,假设我有一个表“pincodes”作为 ------------------------------------- | id | name | parent_id | value | ------------------------------------- | 1 | State | 0 | 0 | | 2 | City1 | 1 | 20220 | | 3 | City2 | 1 | 20221 | 我
-------------------------------------
| 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级层次结构,所以没有问题