ホームページ >データベース >mysql チュートリアル >mysql ツリー クエリを実装するための 25 行のコードの詳細な説明
この記事では、主に 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 開始を実装する
以上がmysql ツリー クエリを実装するための 25 行のコードの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。