如何实现数据库中的文件夹,子文件夹

时间:2012-04-05 17:39:47

标签: php mysql sql recursion relational-database

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

2 个答案:

答案 0 :(得分:3)

你有可能实施一个名为天真树的SQL anti pattern。 请参阅本书的pdf,它显示了几个很好的解决方案。

答案 1 :(得分:0)