Php 按自定义字段排序并从数据库中获取整个树

Php 按自定义字段排序并从数据库中获取整个树,php,mysql,tree,nested,Php,Mysql,Tree,Nested,我试图做一个树型的文件浏览器,但在排序时遇到了问题。 我使用PHP和MySQL来实现这一点。我创建了具有以下字段的混合(嵌套集+邻接)表“element”: element_id, left_key, right_key, level, parent_id, element_name, element_type (enum: 'folder','file'), element_size. 现在我们不讨论最好将有关元素的信息(名称、类型、大小)移动到其他表中 函数可以扫描指定的目录并正确填写表格

我试图做一个树型的文件浏览器,但在排序时遇到了问题。 我使用PHP和MySQL来实现这一点。我创建了具有以下字段的混合(嵌套集+邻接)表“element”:

element_id, left_key, right_key, level, parent_id, element_name, element_type (enum: 'folder','file'), element_size.
现在我们不讨论最好将有关元素的信息(名称、类型、大小)移动到其他表中

函数可以扫描指定的目录并正确填写表格。值得注意的是,我正在按特定顺序向树中添加元素:首先是文件夹,然后是文件

之后,我可以使用简单的查询轻松获取并在页面上显示整个表:

SELECT * FROM element WHERE 1=1 ORDER BY left_key
根据查询结果和另一个函数,我可以生成正确的html代码
  • …等等)。
以显示树

现在回到问题上来(最后,嗯?)。我正在努力添加排序功能。 例如,我想按大小对结果进行排序。在这里,我需要记住树和规则的整个层次结构:首先是文件夹,然后是文件

我相信我可以通过在PHP中生成递归查询来做到这一点:

SELECT * FROM element WHERE parent_id = {$parentId} ORDER BY element_type (so folders would be first), size (or name for example) asc/desc
之后,对于类型为'folder'的每个结果,我将发送另一个查询以获取其内容

此外,还可以通过左键获取整个树,然后在PHP中将其作为数组进行排序,但我想这会更糟:)


我想知道是否有更好、更有效的方法来做这样的事情?

我会用一个辅助脚本来处理这个问题,该脚本用您需要的数据更新某种缓存。为每个负载设置递归查询可能意味着麻烦(可能很少,可能很多,取决于使用情况和其他因素)

如果这些都同时显示,我会亲自运行一个查询来创建数组并用它更新memcached。根据我的需要,我会让它每15分钟运行一次(如果数据经常更改),或者每一两个小时运行一次(如果没有)。我会从另一台机器上运行它(因为我很幸运,我有两台服务器,一台是这样工作的后端机器),如果有一台可用的话

如果memcache不可用,或者一次只加载一个级别,我至少会添加一个字段来存储大小,并用大小递归地更新这些文件夹。这样,您只需拉取正在查看的节点的级别,大小数据就在那里,无需再向下查询任何级别