4

論理プログラミングに問題がありますが、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
4

1 に答える 1

4

ナイーブツリーと呼ばれるSQLアンチパターンを実装する危険があります。本のPDFを参照してください、それはいくつかの良い解決策を示しています。

于 2012-04-05T17:43:17.470 に答える