Ordenar filas con padres e hijos

TZP:

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?

GMB:

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

Demostración de DB violín :

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        

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=387813&siteId=1
Recomendado
Clasificación