Trier les lignes avec les parents et les enfants

TZP:

Je ne sais pas si cela est possible avec MySQL, mais nous allons donner un essai.

Il y a quelques lignes d'une table comme celui-ci

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

et ainsi de suite ... Maintenant, je voudrais trier cette façon. Si le ParentUID est pas 0 Placez-vous en dessous de votre parent.

Donc, dans ce cas, il serait:

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

Enfant20 vient après enfant12, parce que enfant9 est le parent de enfant12. On pourrait dire que cela ressemble à une structure de dossiers. Et non seulement pour trois mais cinq ou sept générations. Est-ce possible ou devrais-je obtenir toutes les données, puis les trier avec un peu de magie PHP?

GMB:

Vous voulez trier la profondeur des dossiers d'abord, de gauche à droite. Une approche courante consiste à parcourir l'arborescence pour construire une colonne de tri qui représente le chemin d'accès à l'élément. En MySQL 8.0, vous pouvez le faire avec un cte récursive:

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

Démo DB Fiddle :

uid | nom | génération | parent_uid | chemin        
-: | : ------ | ---------: | ---------: | : ---------- 
  1 | Parent1 | 1 | 0 | 001         
  3 | parent2 | 1 | 0 | 003         
 14 | enfant7 | 2 | 3 | 003/014     
 17 | enfant8 | 2 | 3 | 003/017     
 90 | Child40 | 3 | 17 | 003/017/090 
  7 | Parent4 | 1 | 0 | 007         
 55 | enfant9 | 2 | 7 | 007/055     
 75 | enfant12 | 3 | 55 | 007/055/075 
 95 | enfant20 | 2 | 7 | 007/095     
 20 | Parent8 | 1 | 0 | 020        

Je suppose que tu aimes

Origine http://10.200.1.11:23101/article/api/json?id=387810&siteId=1
conseillé
Classement