我遇到逻辑编程问题,但我认为这可能是另一种解决方案,在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