이 글은 주로 25라인 mysql 트리 쿼리 코드에 대한 자세한 설명을 공유합니다.
요구 사항: 현재(모든) 수준 아래의 모든 하위 노드를 찾습니다.
사용자 정의 mysql 함수를 통해 달성, 먼저 코드를 붙여넣고 나중에 자세한 지침 제공:
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 $$
Create 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 | +----+------------+------+
Line 1:
delimiter 함수 본문 내용을 작성할 때 DELIMITER 키워드를 사용해야 합니다. 구분 기호를 분리하려면 먼저 다른 것으로 변경하세요. 그렇지 않으면 명령문을 작성할 때 ';'을 쓸 때 직접 실행되어 함수가 실패하게 됩니다.
2-4행: mysql 함수 구문 사양, 설명이 별로 없습니다.
5-9행: 논리 필수 변수를 정의합니다.
childListStr: 최종 반환된 하위 노드 ids_str(예: "1,2,3,4,5").
tempChildStr: 임시 하위 노드 ids_str(예: "1").
rootIdStr: 입력 루트 노드를 char 유형으로 변환합니다.
Lines 10-23: 전체 함수에서 가장 중요한 부분은 while의 tempChildStr 처리와 내장 함수 GROUP_CONCAT 및 FIND_IN_SET
每一次循环,通过 GROUP_CONCAT函数找出输入的根节点的直接下级节点,通过GROUP_CONCAT函数得到这些子节点的id组成的字符串。并将这次得到的子字符串作为根节点,去寻找下一级的所有的子节点。 最后找到最后子节点没有下级时候,tempChildStr IS NOT NULL。退出循环,返回结果。
에 대한 이해입니다. 실행 결과:
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)
관련 권장 사항:
mysql - MYSQL을 사용하여 재귀 트리 쿼리로 연결로 oracle 시작을 구현
위 내용은 MySQL 트리 쿼리를 구현하기 위한 25줄의 코드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!