>  기사  >  데이터 베이스  >  MySQL 트리 쿼리를 구현하기 위한 25줄의 코드에 대한 자세한 설명

MySQL 트리 쿼리를 구현하기 위한 25줄의 코드에 대한 자세한 설명

小云云
小云云원래의
2018-01-29 13:27:082032검색

이 글은 주로 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)

관련 권장 사항:

SQL 문 구현 자손 트리 쿼리의 고전적인 예

mysql - MYSQL을 사용하여 재귀 트리 쿼리로 연결로 oracle 시작을 구현

Oracle 트리 쿼리 및 관련 함수

위 내용은 MySQL 트리 쿼리를 구현하기 위한 25줄의 코드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.