Maison > base de données > tutoriel mysql > 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
Libérer: 2024-11-02 03:00:30
original
543 Les gens l'ont consulté

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

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

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 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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal