mysql - 仅从查询获取parent>child1_1>child1_1_1>child1_1_1_1结构

标签 mysql sql

我有一个包含 3 列的表格,例如:

name | id | parent_id

XYZ  | 1  |   2
ZYX  | 3  |   1
YXZ  | 4  |   3

是否可以仅从 mysql 查询中检索一个可以简单地读取为字符串的结果,如“parent>child1_1>child1_1_1>child1_1_1_1”等?层次结构树的最大深度为 4,“父级”的parent_id=0。用 php 构建它让我很头疼。

更具体地说,父类别有多个子类别,子类别也有多个子类别...我想获取所有记录,例如“计算机>网络>路由器”、“计算机>网络>交换机”等结果。

非常感谢!

最佳答案

通常这是使用递归ctes完成的,mysql不支持它

由于您的深度只有 4 级,因此您可以使用 self left join 来连接父级,如下所示

concat_ws 用于连接名称。

更新了获取最深子 ID 的答案,因为这需要使用 coalesce

select  coalesce(t3.id,t2.id, t1.id) as deepChildId, 
        concat_ws('->', t.name ,t1.name, t2.name, t3.name ) as childList
from Table1 t
left join Table1 t1
on t.id = t1.parent_id
left join Table1 t2
on  t1.id = t2.parent_id
left join Table1 t3
on  t2.id = t3.parent_id
where t.parent_id =0

关于mysql - 仅从查询获取parent>child1_1>child1_1_1>child1_1_1_1结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27747171/

相关文章:

mysql - sequelize 多对多关系

c# - C# 中的 mysql 查询登录

php - 一个 PHP 脚本带有两个 PDO 查询?

mysql-workbench 不会看到其他客户端所做的数据库更改,除非重新启动连接

java - 在 MySQL 数据库中将 java 对象存储为 json 字符串?

c# - C#中的sql插入命令

sql - 如何使用 SQL 窗口函数计算聚合的百分比

java - 数据库中的旧数据不断被新数据替换

php - 使用 Bootstrap 4 水平居中动态 div.card

sql - 从按多列分组的行组中选择具有最大值的行(PSQL)