0

こんにちは私は次のようなテーブルを持っています

ID  ||  NAME ||  PARENTID ||  LEAF  
1   ||   A   ||    NULL   ||   0      
2   ||   B   ||     1     ||   0  
3   ||   c   ||     2     ||   1  
4   ||   A   ||     1     ||   1

これは、データテーブル内の一種のツリー構造です。特定の親のすべてのリーフノード(Leaf = 1)を取得したいのですが、誰かがこれに対するSQLクエリを提案できますか?

私はこれを試しました:

select ( SELECT LEAF,NAME FROM Tablex WHERE PARENTID=1) from Tablex where LEAF=1
4

2 に答える 2

3

データベースのツリー構造は非常に一般的な問題です。

多くの可能なアプローチがあります。

SQL(MySQLの場合)はツリー構造を処理するための最良の方法ではありません。ツリー構造には無制限のレベルがある可能性があり、MySQLではこのような再通貨を処理する(効果的な)方法がないためです。 nはツリーレベルの数です。レベルの数が異なる場合は、PL / SQL(手続き型SQL)でストアド・プロシージャを使用する必要があります。これは、PHP、C、またはその他の言語の単純なループよりもはるかに効果が低くなります(速度が遅く、メモリの使用量が多くなります)。

テーブルを他の言語(PHPまたは使用している他の言語)のツリーに変換することを検討してください。

Gordon Linoffとypercubeがコメントで書いたように、より高度なデータベース(Oracleなど)があり、これらのデータベースでツリーを処理する方が、プログラミング/コーディングにおいてより効果的で快適です。

追加情報:

MySQLでの階層データの管理(Mike Hillyerによる)

Google検索:SQLツリー構造

PHPのアプローチ:

php/Mysqlの最高のツリー構造

クエリをループしないカテゴリとサブカテゴリのPHPツリー構造

そして、 ypercubeからのもう1つの便利なリンク:

階層データのモデル-BillKarwin/ Karwin SoftwareSolutionsLLCによるプレゼンテーション

于 2013-02-28T19:43:01.753 に答える
1

試したクエリは次のようになります。

select tt.* FROM 
( SELECT LEAF,NAME FROM Tablex WHERE PARENTID IS NOT NULL and PARENTID=1 ) AS tt 
WHERE leaf=1;

さらに試してみたい場合は、SQL Fiddleをご覧ください:http ://sqlfiddle.com/#!2/2d95b8/2

于 2013-02-28T20:11:41.780 に答える