ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

PHP-如何在数据库中实现文件夹,子文件夹

2019-12-01 14:16:31  阅读:242  来源: 互联网

标签:relational-database sql mysql php recursion


我在逻辑编程方面遇到问题,但是我认为这可能是在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

解决方法:

您有实现SQL anti pattern(称为朴素树)的危险.
参见该书的pdf文件,其中显示了一些好的解决方案.

标签:relational-database,sql,mysql,php,recursion
来源: https://codeday.me/bug/20191201/2081365.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有