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?
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
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