Disons que nous avons une seule table avec 3 colonnes: ID , PARENT_ID et VALEUR .
Nous avons par exemple 8 enregistrements:
ID PARENT_ID VALUE
A NULL 1
B A 1
C B 0
D C 1
E D 1
F E 1
G F 1
H G 0
Comment pouvons-nous vérifier à l'aide d'une requête SQL ou une procédure stockée (pour MySQL de préférence) le cas échéant du dossier parent pour l'enregistrement avec l'ID « G » a une valeur de 0? Si un parent de la chaîne a 0 pour la valeur, il n'y a pas besoin de vérifier plus en arrière.
Cela doit travailler en prenant une ID enfant et regard sur l'ensemble de la chaîne de ses parents , avant cet enfant. Certains enfants n'ont pas de parents ou pourrait aussi avoir une chaîne des parents et un enregistrement parent peut avoir 0 ou plusieurs enregistrements d'enfants.
Dans cet exemple, la recherche se terminerait à enregistrer avec ID « C » (à savoir: retour cet ID est très bien) car il est le dossier parent de la chaîne des parents (pour G) qui est 0 pour la valeur.
Voici un exemple d'une requête CTE récursive MySQL 8.0 qui fait ce que vous décrivez, parcourir les ancêtres des « G » et revenir ceux qui ont une valeur = 0:
with recursive cte as (
select * from mytable where id = 'G'
union all
select t.* from cte join mytable t on t.id = cte.parent_id
) select * from cte where value = 0;
+------+-----------+-------+
| id | parent_id | value |
+------+-----------+-------+
| C | B | 0 |
+------+-----------+-------+
Lire https://dev.mysql.com/doc/refman/8.0/en/with.html pour plus sur les requêtes CTE récursives.