Maison > Article > base de données > Explication détaillée de 25 lignes de code pour implémenter la requête d'arborescence MySQL
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
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!