Utilisation d'une requête MySQL pour parcourir des lignes et créer un arbre récursif
Énoncé du problème
Dans une table de nomenclature (BOM) avec des colonnes article et parent, vous devez récupérer une arborescence récursive affichant relations parents-enfants. Le résultat souhaité peut impliquer plusieurs niveaux de hiérarchie, mais actuellement, vous êtes limité à récupérer soit un seul niveau, soit à récupérer tous les enregistrements et à les trier manuellement à l'aide d'une fonction récursive, ce qui peut s'avérer inefficace.
Solution
Bien que MySQL lui-même ne prenne pas en charge nativement la traversée récursive d'arborescence, vous pouvez utiliser des procédures stockées pour obtenir cette fonctionnalité. Une approche consiste à créer trois procédures stockées :
En appelant ces procédures stockées avec l'ID de l'article de départ, vous pouvez parcourir de manière récursive les lignes de la table BOM et construire l'arborescence souhaitée structure.
Exemple de procédure stockée :
CREATE PROCEDURE GetFamilyTree(IN start_item_id INT) BEGIN # Declare variables DECLARE parent_id INT; DECLARE ancestry VARCHAR(255); DECLARE done TINYINT DEFAULT 0; # Loop through item IDs until done WHILE NOT done DO # Get parent ID CALL GetParentIDByID(start_item_id, parent_id); # If parent ID is null, we're done IF parent_id IS NULL THEN SET done = 1; LEAVE; END IF; # Append parent ID to ancestry SET ancestry = CONCAT(ancestry, ',', parent_id); # Set current item ID to parent ID SET start_item_id = parent_id; END WHILE; # Return ancestry as result SELECT ancestry; END
Utilisation :
Pour récupérer l'arbre généalogique à partir de l'ID de l'élément 1, appelez la procédure stockée :
CALL GetFamilyTree(1);
Le résultat sera une chaîne séparée par des virgules contenant le ascendance de l'article 1.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!