假设我有一个表'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|
--------------------
我需要的是父状态应该附加到每个城市。
注意:任何人都可以提出更好的问题标题。
答案 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
函数,您可以将父级的名称与子级名称连接起来。
编辑:
以上查询仅适用于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