Maison  >  Article  >  base de données  >  Comment implémenter des niveaux illimités de requêtes de relation parent-enfant en une seule phrase dans MySQL

Comment implémenter des niveaux illimités de requêtes de relation parent-enfant en une seule phrase dans MySQL

jacklove
jackloveoriginal
2018-06-15 09:24:184802parcourir

Dans SQL Server, il est facile d'utiliser des expressions CTE pour interroger des niveaux infinis de relations parent-enfant ; dans les versions qui ne prennent pas en charge les expressions CTE, cela peut également être facilement réalisé à l'aide de la fonction. récursivité.
Dans MySQL, l'exemple de cette exigence est légèrement compliqué. Il n'y a pas de requête qui prend en charge la récursion dans MySQL, il n'y a pas de fonction table et la fonction ne prend pas en charge la récursion, elle est donc généralement implémentée avec une boucle, ce qui semble gênant. Aujourd'hui, j'ai vu une requête récursive implémentée avec une seule instruction. J'ai une idée unique et j'aimerais la partager.

Tutoriels vidéo MySQL associés recommandés : "Tutoriel MySQL"

Structure et données de la table

CREATE TABLE table1(id int, name varchar(10), parent_id int); 
INSERT table1 VALUES 
(1, ‘Home’,        0), 
(2, ‘About’,       1), 
(3, ‘Contact’,     1), 
(4, ‘Legal’,         2), 
(5, ‘Privacy’,      4), 
(6, ‘Products’,   1), 
(7, ‘Support’,     2);

Requête sur tout l'id = 5 Parent

SELECT ID.level, DATA.* FROM( 

    SELECT 

        @id as _id, 

        (   SELECT @id := parent_id 

            FROM table1 

            WHERE id = @id 

        ) as _pid, 

        @l := @l+1 as level 

    FROM table1, 

        (SELECT @id := 5, @l := 0 ) b 

    WHERE @id > 0 
) ID, table1 DATA 
WHERE ID._id = DATA.id 
ORDER BY level;

Selon cette méthode de requête parent, il est facile d'écrire une requête pour tous les enfants La requête suivante id=2 pour tous les enfants

SELECT ID.level, DATA.* FROM( 

    SELECT 

        @ids as _ids, 

        (   SELECT @ids := GROUP_CONCAT(id) 

            FROM table1 

            WHERE FIND_IN_SET(parent_id, @ids) 

        ) as cids, 

        @l := @l+1 as level 

    FROM table1, 

        (SELECT @ids :=’1’, @l := 0 ) b 

    WHERE @ids IS NOT NULL 
) id, table1 DATA 
WHERE FIND_IN_SET(DATA.id, ID._ids) 
ORDER BY level, id

Cet article explique Apprendre. comment implémenter des niveaux illimités de requêtes de relation parent-enfant en une seule phrase dans MySQL Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois.

Recommandations associées :

Comment accéder à SQL Server FileStream avec progression

Que faire lorsque vous oubliez votre SQL Server mot de passe administrateur Comment gérer

Une brève analyse de l'utilisation de concat et group_concat dans MySQL

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