2012-04-05 16 views
3

私はロジックプログラミングに問題がありますが、SQLコマンドでこれを行う方がはるかに簡単だと思います。データベース内のフォルダ、サブフォルダを実装する方法

私はこのようなMySQLの(のInnoDB)でテーブルを持っている:

CREATE TABLE IF NOT EXISTS `folder` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `folder_id` INT NOT NULL , 
    `name` VARCHAR(100) NULL , 
    `hidden` TINYINT(1) NOT NULL DEFAULT 0 , 
    PRIMARY KEY (`id`) , 
    INDEX `fk_folder_folder1` (`folder_id` ASC) , 
    CONSTRAINT `fk_folder_folder1` 
    FOREIGN KEY (`folder_id`) 
    REFERENCES `folder` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 

それはかなり簡単なように思えるが、私は、このフォルダのサブフォルダの下に表示されますような方法で、フォルダを一覧表示したいですそれ。任意のファイルリポジトリに似ています。例えば


テーブルで :

id name folder_id 
1 root 1 
2 etc  1 
3 dev  1 
4 apache 2 
5 php  2 
6 mysql 2 
7 hda  3 
8 hda1 3 
9 lib  1 

私はこのようにそれを見せたい:

root 
    etc 
     apache 
     php 
     mysql 
    dev 
     hda 
     hda1 
    lib 

質問は、SQLコマンドまたはでこれを行う方法を持っていますPHP?
私はPHPでmakeを試していますが、再帰的な関数がない場合は表示されません。しかし、私は成功していません。

ソリューション:
MySQLはWITH句を受け入れていないので、SQLでの再帰関数はボックスの外にあります。みんなありがとう。

SELECT c2.name 
FROM folder c1 LEFT OUTER JOIN folder c2 
ON c2.folder_id = c1.id WHERE c2.folder_id = 1 // the id of the parent folder 
AND c2.id != c2.folder_id    // Remove the parent folder 
ORDER BY c2.folder ASC 
+0

が重複する可能性を見てみましょう[マテリアライズド・パスでツリーをソートする?](http://stackoverflow.com/questions/2797720/sorting-tree-with-a-materialized-path) – RedFilter

答えて

3

あなたはSQL anti patternと呼ばれる素朴な木の実装の危険にさらされています。 本のpdfを見ると、いくつかの良い解決策が示されています。

+2

これは、(まだ)再帰クエリをサポートしていないため、これはMySQLの反パターンのみです。他のDBMSでは、このような構造を扱うことは非常に効率的です。 –

+0

ありがとう、これはとても役に立ちました。あなたは私の一日を救った。 – Guilherme

+1

リンクされているが、ツリーを使用する代わりに表示されていないPDFを読みました。もし誰かが反パターンに反対して動くなら、私は代わりの解決法を提案する必要があると思う。その間は、引き続きOracleのいずれかを使用して接続し、ストアドプロシージャまたはCTEを作成します。そして非常に有用な木構造。 – Karl

関連する問題