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