Maison  >  Article  >  base de données  >  Comment récupérer tous les dossiers enfants et sous-enfants dans une base de données hiérarchique à l'aide d'une seule requête SQL ?

Comment récupérer tous les dossiers enfants et sous-enfants dans une base de données hiérarchique à l'aide d'une seule requête SQL ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-02 03:00:30380parcourir

How to Retrieve All Child and Subchild Folders in a Hierarchical Database using a Single SQL Query?

Requête récursive pour récupérer tous les dossiers enfants et sous-enfants dans MySQL

Question :

Comment puis-je concevoir une seule requête SQL pour récupérer tous les dossiers enfants et sous-enfants pour un ID de dossier parent donné dans une base de données hiérarchique ?

Scénario :

Considérez un dossier de table 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`)
);

Le tableau est renseigné comme suit :

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

Énoncé du problème :

Nous voulons concevoir une requête qui renvoie tous les dossiers enfants et sous-enfants pour un ID de dossier parent donné. Par exemple :

  • Pour l'ID de dossier parent 1, la requête doit renvoyer [2, 3, 4, 5, 6, 7].
  • Pour l'ID de dossier parent 4, la requête doit renvoyer [5, 7, 6].
  • Pour l'ID de dossier parent 3, la requête doit renvoyer [4, 5, 6, 7].

Solution :

La requête suivante utilise une technique récursive pour obtenir le résultat souhaité :

<code class="sql">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;</code>

Explication :

  • La requête utilise une variable définie par l'utilisateur @pv pour stocker la liste des ID de dossier enfant séparés par des virgules pour le niveau actuel.
  • La sous-requête de l'instruction SELECT récupère les ID de dossier enfant pour le niveau actuel, en les séparant par des virgules .
  • La requête externe concatène ensuite les résultats de tous les niveaux, fournissant une liste séparée par des virgules de tous les ID de dossier enfant et sous-enfant pour le parent spécifié.

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