【问题标题】:how implement a folder, subfolder in a Database如何在数据库中实现文件夹、子文件夹
【发布时间】:2012-04-19 11:16:27
【问题描述】:

我在逻辑编程方面遇到问题,但我认为这可能是另一种更容易在 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 中制作,但我看不到没有递归函数的方法。但我没有成功。

解决方案:
因为 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

【问题讨论】:

标签: php mysql sql recursion relational-database


【解决方案1】:

您面临实施称为幼稚树的SQL anti pattern 的危险。 看这本书的pdf,它展示了几个很好的解决方案。

【讨论】:

  • 这只是 MySQL 的反模式,因为它(仍然)不支持递归查询。在其他 DBMS 中,处理这种结构非常有效。
  • 我阅读了链接的 PDF,但没有看到使用树的替代方法。如果有人要反对反模式,我认为需要提出替代解决方案。与此同时,我将继续使用 Oracle 的连接方式,编写存储过程或 CTE。以及非常有用的树形结构。
  • @Karl,在本章的最后,有一个使用 WITH 子句的 SQL 递归实现,但是有一些不支持存储层次结构的 RDBMS(参见第 3.4 节)。
猜你喜欢
  • 1970-01-01
  • 2016-01-30
  • 2014-08-22
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
相关资源
最近更新 更多