Maison >base de données >tutoriel mysql >Comment implémenter la récupération récursive de dossiers dans MySQL ?

Comment implémenter la récupération récursive de dossiers dans MySQL ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-02 14:47:30245parcourir

How to Implement Recursive Folder Retrieval in MySQL?

Récupération récursive des dossiers enfants dans MySQL

Lorsque vous travaillez avec des structures de données hiérarchiques, il devient nécessaire de récupérer les éléments enfants et leurs sous-enfants à partir de la base de données. Dans le cas d'une table représentant des dossiers, une requête est requise pour récupérer tous les dossiers enfants d'un dossier parent donné.

Considérons le scénario où nous avons une table de dossiers avec la structure suivante :

CREATE TABLE IF NOT EXISTS `Folder` (
    `idFolder` INT(11) NOT NULL AUTO_INCREMENT,
    `FolderName` VARCHAR(150) NOT NULL,
    `idFolderParent` INT(11) NULL,
    PRIMARY KEY (`idFolder`),
    CONSTRAINT `fk_1`
    FOREIGN KEY (`idFolderParent`)
    REFERENCES `Folder` (`idFolder`)
);

Nous avons un exemple d'ensemble de données pour cette table :

idFolder , FolderName , idFolderParent
   1           ADoc           Null  
   2           ADoc1           1  
   3           ADoc2           2
   4           ADoc3           3
   5           ADoc4           4
   6           ADoc5           5
   7           ADoc6           4

Le défi

Étant donné un idFolder, l'objectif est de composer une seule requête qui récupère tous ses dossiers enfants, ainsi que tous les dossiers sous-enfants de manière récursive. Par exemple :

  • Lorsque idFolder vaut 1, le résultat doit être : 2, 3, 4, 5, 6, 7
  • Pour idFolder 4, le résultat attendu est : 5, 6, 7
  • De même, pour idFolder 3, le résultat devrait être : 4, 5, 6, 7

La solution

La solution fournie exploite une combinaison de variables MySQL définies par l'utilisateur et une sous-requête pour réaliser une récupération récursive :

SELECT GROUP_CONCAT(lv SEPARATOR ',') FROM (
  SELECT @pv:=(SELECT GROUP_CONCAT(idFolder SEPARATOR ',') FROM Folder 
WHERE FIND_IN_SET(idFolderParent, @pv)) AS lv FROM Folder 
JOIN
(SELECT @pv:=5) tmp
) a;

Explication

La requête utilise la fonction FIND_IN_SET() pour vérifier si l'idFolderParent de la ligne actuelle existe dans la valeur de la variable définie par l'utilisateur @pv. Si tel est le cas, la valeur est ajoutée à la variable lv. La sous-requête génère plusieurs lignes, chacune représentant un niveau de recherche récursive.

En utilisant la fonction GROUP_CONCAT() avec la clause SEPARATOR, les résultats de chaque ligne sont combinés et séparés par le délimiteur spécifié (dans ce cas , une virgule). Le résultat final est une chaîne contenant les dossiers enfants concaténés.

Cette solution fournit une méthode robuste pour récupérer les dossiers enfants et sous-enfants de manière récursive, même lorsque l'ordre des parents dans la base de données peut ne pas être strictement hiérarchique.

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!

Déclaration:
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