Maison >base de données >tutoriel mysql >Explication détaillée de 25 lignes de code pour implémenter la requête d'arborescence MySQL

Explication détaillée de 25 lignes de code pour implémenter la requête d'arborescence MySQL

小云云
小云云original
2018-01-29 13:27:082035parcourir

Cet article partage principalement avec vous l'explication détaillée du code de requête de l'arborescence MySQL de 25 lignes. J'espère qu'il pourra vous aider.

Exigence : recherchez tous les nœuds enfants sous le niveau actuel (n'importe quel).

Obtenu grâce à la fonction mysql personnalisée, collez d'abord le code et donnez des instructions détaillées plus tard :

delimiter $$
CREATE FUNCTION `getChildList`(rootId INT)
RETURNS varchar(1024)
BEGIN
    DECLARE childListStr VARCHAR(1024);
    DECLARE tempChildStr VARCHAR(1024);
    DECLARE rootIdStr VARCHAR(64);
    SET childListStr=NULL;
    SET rootIdStr=cast(rootId as CHAR);
    myloop: WHILE TRUE
    DO
        SELECT GROUP_CONCAT(id) INTO tempChildStr FROM test where FIND_IN_SET(parrent_id,rootIdStr)>0;
        IF tempChildStr IS NOT NULL THEN
            SET rootIdStr=tempChildStr;
            IF childListStr IS NULL THEN
                SET childListStr=tempChildStr;
            ELSE
                SET childListStr=concat(childListStr,',',tempChildStr);
            END IF;
        ELSE
            LEAVE myloop;
        END IF;
    END WHILE;
  RETURN childListStr;
END $$

Créez une table SQL :

CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `parrent_id` int(11) DEFAULT '0',
  `name` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| parrent_id | int(11)          | YES  |     | 0       |                |
| name       | varchar(32)      | YES  |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+

+----+------------+------+
| id | parrent_id | name |
+----+------------+------+
|  1 |          0 | cg1  |
|  2 |          1 | cg2  |
|  3 |          2 | cg3  |
|  4 |          3 | cg4  |
|  5 |          4 | cg5  |
|  6 |          5 | cg6  |
|  7 |          6 | cg7  |
|  8 |          7 | cg8  |
|  9 |          8 | cg9  |
| 10 |          1 | cg10 |
| 11 |          2 | cg11 |
+----+------------+------+

Ligne 1 :
Lorsque le délimiteur écrit le contenu du corps de la fonction, vous devez d'abord utiliser le mot-clé DELIMITER pour remplacer le délimiteur par autre chose, sinon, lors de l'écriture de l'instruction, elle sera exécutée directement, ce qui entraînera l'échec de l'écriture de la fonction

.

Lignes 2-4 : Spécifications de la syntaxe de la fonction MySQL, pas beaucoup d'explications

Lignes 5-9 : Définir les variables requises pour la logique.

childListStr : le nœud enfant final renvoyé ids_str (par exemple : "1,2,3,4,5").
tempChildStr : Nœud enfant temporaire ids_str (par exemple : "1").
rootIdStr : convertit le nœud racine d'entrée en type char.

Lignes 10 à 23 : La partie la plus critique de l'ensemble de la fonction est le traitement de tempChildStr dans while et la compréhension des fonctions intégrées GROUP_CONCAT et FIND_IN_SET

每一次循环,通过 GROUP_CONCAT函数找出输入的根节点的直接下级节点,通过GROUP_CONCAT函数得到这些子节点的id组成的字符串。并将这次得到的子字符串作为根节点,去寻找下一级的所有的子节点。
最后找到最后子节点没有下级时候,tempChildStr IS NOT NULL。退出循环,返回结果。

Résultats d'exploitation :

mysql> select getChildList(1);
+-----------------------+
| getChildList(1)       |
+-----------------------+
| 2,10,3,11,4,5,6,7,8,9 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select getChildList(2);
+------------------+
| getChildList(2)  |
+------------------+
| 3,11,4,5,6,7,8,9 |
+------------------+
1 row in set (0.00 sec)

Recommandations associées :

Instruction SQL pour implémenter un exemple classique de requête d'arbre descendant

mysql utilisant MYSQL pour implémenter Oracle Start avec Connect par requête d'arborescence récursive

Requête d'arborescence Oracle et fonctions associées

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