CHỈNH SỬA
mẫu làm việc giải quyết ghi chú Gordons
Truy vấn tính toán đường dẫn nút khi bạn đã cố định độ sâu cây tối đa và sắp xếp theo thứ tự.
Thiết lập lược đồ MySQL 5.5.30 :
create table mytable(id int, parent_id int, name varchar(100));
insert mytable(id, parent_id, name)
values (1, null, 'Home'),
(2, null, 'Services'),
(3, 2, 'Baking'),
(4, 3, 'Cakes'),
(5, 3, 'Bread'),
(6, 5, 'Flat Bread'),
(7, 1, 'Something');
Truy vấn 1 :
select t0.*,
concat(
case coalesce(t4.Parent_ID, 0)
when 0 then ''
else concat(cast(t4.Parent_ID as char), '\\')
end,
case coalesce(t3.Parent_ID, 0)
when 0 then ''
else concat(cast(t3.Parent_ID as char), '\\')
end,
case coalesce(t2.Parent_ID, 0)
when 0 then ''
else concat(cast(t2.Parent_ID as char), '\\')
end,
case coalesce(t1.Parent_ID, 0)
when 0 then ''
else concat(cast(t1.Parent_ID as char), '\\')
end,
case coalesce(t0.Parent_ID, 0)
when 0 then ''
else concat(cast(t0.Parent_ID as char), '\\')
end,
cast(t0.id as char)
) as path
from mytable t0
left join mytable t1 on t0.Parent_ID = t1.Id
left join mytable t2 on t1.Parent_ID = t2.Id
left join mytable t3 on t2.Parent_ID = t3.Id
left join mytable t4 on t3.Parent_ID = t4.Id
order by
concat(
case coalesce(t4.Parent_ID, 0)
when 0 then ''
else concat(cast(t4.Parent_ID as char), '\\')
end,
case coalesce(t3.Parent_ID, 0)
when 0 then ''
else concat(cast(t3.Parent_ID as char), '\\')
end,
case coalesce(t2.Parent_ID, 0)
when 0 then ''
else concat(cast(t2.Parent_ID as char), '\\')
end,
case coalesce(t1.Parent_ID, 0)
when 0 then ''
else concat(cast(t1.Parent_ID as char), '\\')
end,
case coalesce(t0.Parent_ID, 0)
when 0 then ''
else concat(cast(t0.Parent_ID as char), '\\')
end,
cast(t0.id as char)
)
Kết quả :
| ID | PARENT_ID | NAME | PATH |
-----------------------------------------
| 1 | (null) | Home | 1 |
| 7 | 1 | Something | 1\7 |
| 2 | (null) | Services | 2 |
| 3 | 2 | Baking | 2\3 |
| 4 | 3 | Cakes | 2\3\4 |
| 5 | 3 | Bread | 2\3\5 |
| 6 | 5 | Flat Bread | 2\3\5\6 |