ホームページ >データベース >mysql チュートリアル >mysql ツリー クエリを実装するための 25 行のコードの詳細な説明

mysql ツリー クエリを実装するための 25 行のコードの詳細な説明

小云云
小云云オリジナル
2018-01-29 13:27:082060ブラウズ

この記事では、主に 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 $$

テーブル 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 |
+----+------------+------+

行 1:
delimiter 関数本体の内容を記述するときは、DELIMITER キーワードを使用する必要があります区切り文字を区切るには、最初に別の値に変更してください。そうしないと、ステートメントを作成するときに ';' を記述するときに直接実行され、関数が失敗します。

行 2 ~ 4: mysql 関数の構文の仕様、あまり説明はありません。

行 5 ~ 9: ロジックに必要な変数を定義します。

childListStr: 最終的に返された子ノード ids_str (例: "1,2,3,4,5")。
tempChildStr: 一時的な子ノードの ids_str (例: "1")。
rootIdStr: 入力ルートノードをchar型に変換します。

行 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。