Maison > base de données > tutoriel mysql > Comment les procédures stockées MySQL peuvent-elles résoudre le parcours récursif d'arbre dans une table de nomenclature ?

Comment les procédures stockées MySQL peuvent-elles résoudre le parcours récursif d'arbre dans une table de nomenclature ?

DDD
Libérer: 2024-12-04 16:26:14
original
326 Les gens l'ont consulté

How Can MySQL Stored Procedures Solve Recursive Tree Traversal in a Bill of Materials Table?

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 :

  1. GetParentIDByID : Récupère l'ID parent d'un ID d'élément donné.
  2. GetAncestry : Renvoie tous les ancêtres (parents et grands-parents) d'un élément donné ID.
  3. GetFamilyTree : Combine les fonctionnalités de GetParentIDByID et GetAncestry pour générer un arbre généalogique complet pour un ID d'élément donné.

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
Copier après la connexion

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);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal