ホームページ  >  記事  >  データベース  >  MySQL で単一の文で無制限のレベルの親子関係クエリを実装する方法

MySQL で単一の文で無制限のレベルの親子関係クエリを実装する方法

jacklove
jackloveオリジナル
2018-06-15 09:24:184802ブラウズ

SQL Server では、CTE 式を使用して無限レベルの親子関係をクエリするのが簡単です。CTE 式をサポートしていないバージョンでは、関数の再帰を使用して簡単に実現することもできます。
MySQL では、この要件の例は少し複雑です。MySQL には再帰をサポートするクエリがなく、テーブル値関数もなく、関数も再帰をサポートしていないため、通常はループで実装されるようです。気まずい。今日は、単一のステートメントで再帰クエリが実装されているのを見たので、それを共有したいと思います。

おすすめの関連mysqlビデオチュートリアル: "mysqlチュートリアル"

テーブルの構造とデータ

CREATE TABLE table1(id int, name varchar(10), parent_id int); 
INSERT table1 VALUES 
(1, ‘Home’,        0), 
(2, ‘About’,       1), 
(3, ‘Contact’,     1), 
(4, ‘Legal’,         2), 
(5, ‘Privacy’,      4), 
(6, ‘Products’,   1), 
(7, ‘Support’,     2);

ID = 5のすべての親をクエリ

SELECT ID.level, DATA.* FROM( 

    SELECT 

        @id as _id, 

        (   SELECT @id := parent_id 

            FROM table1 

            WHERE id = @id 

        ) as _pid, 

        @l := @l+1 as level 

    FROM table1, 

        (SELECT @id := 5, @l := 0 ) b 

    WHERE @id > 0 
) ID, table1 DATA 
WHERE ID._id = DATA.id 
ORDER BY level;

この親クエリメソッドによれば、チェックするクエリを簡単に作成できますすべての子レベル、次のクエリ id=2 すべての子

SELECT ID.level, DATA.* FROM( 

    SELECT 

        @ids as _ids, 

        (   SELECT @ids := GROUP_CONCAT(id) 

            FROM table1 

            WHERE FIND_IN_SET(parent_id, @ids) 

        ) as cids, 

        @l := @l+1 as level 

    FROM table1, 

        (SELECT @ids :=’1’, @l := 0 ) b 

    WHERE @ids IS NOT NULL 
) id, table1 DATA 
WHERE FIND_IN_SET(DATA.id, ID._ids) 
ORDER BY level, id

この記事では、MySQL で無限レベルの親子関係クエリを 1 つの文で実装する方法について説明します。関連コンテンツの詳細については、PHP 中国語 Web サイトを参照してください。

関連する推奨事項:

進行状況に応じて SQL Server FileStream にアクセスする方法

SQL Server 管理者パスワードを忘れた場合の対処方法

MySQL での concat と group_concat の使用の簡単な分析

以上がMySQL で単一の文で無制限のレベルの親子関係クエリを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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