No estoy seguro de si esto es posible con MySQL, pero vamos a darle una oportunidad.
Hay un par de filas en una tabla como ésta
UID - Name - Generation - ParentUID
1 - Parent1 - 1 - 0
3 - Parent2 - 1 - 0
7 - Parent4 - 1 - 0
14 - Child7 - 2 - 3
17 - Child8 - 2 - 3
20 - Parent8 - 1 - 0
55 - Child9 - 2 - 7
75 - Child12 - 3 - 55
90 - Child40 - 3 - 17
95 - Child20 - 2 - 7
y así sucesivamente ... Ahora me gustaría a solucionar el problema de esa manera. Si el ParentUID no es 0 lugar a sí mismo por debajo de su padre.
Así que en ese caso sería:
UID - Name - Generation - ParentUID
1 - Parent1 - 1 - 0
3 - Parent2 - 1 - 0
14 - Child7 - 2 - 3
17 - Child8 - 2 - 3
90 - Child40 - 3 - 17
7 - Parent4 - 1 - 0
55 - Child9 - 2 - 7
75 - Child12 - 3 - 55
95 - Child20 - 2 - 7
20 - Parent8 - 1 - 0
Child20 se produce después de Niño12, porque Niño9 es el padre del Niño12. Se podría decir que se parece a una estructura de carpetas. Y no sólo para los tres, pero por cinco o siete generaciones. ¿Es posible o debería obtener todos los datos y luego clasificarla con un poco de magia PHP?
Desea ordenar primera profundidad de registros, el de izquierda a derecha. Un enfoque común es recorrer el árbol para construir una columna de ordenación que representa la ruta al elemento. En MySQL 8.0, puede hacer esto con un CTE recursiva:
with recursive cte(uid, name, generation, parent_uid, path) as (
select t.*, cast(lpad(uid, 3, 0) as char(100)) from mytable t where parent_uid = 0
union all
select t.*, concat(c.path, '/', lpad(t.uid, 3, 0))
from cte c
inner join mytable t on t.parent_uid = c.uid
)
select * from cte order by path
UID | nombre | generación | parent_uid | ruta -: | ------ | ---------: | ---------: | : ---------- 1 | Parent1 | 1 | 0 | 001 3 | parent2 | 1 | 0 | 003 14 | Niño7 | 2 | 3 | 003/014 17 | Niño8 | 2 | 3 | 003/017 90 | Child40 | 3 | 17 | 003/017/090 7 | Parent4 | 1 | 0 | 007 55 | Niño9 | 2 | 7 | 007/055 75 | Niño12 | 3 | 55 | 007/055/075 95 | Child20 | 2 | 7 | 007/095 20 | Parent8 | 1 | 0 | 020