按自定义字段排序并从DB中获取整个树

时间:2010-05-03 15:18:54

标签: php mysql tree nested

我正在尝试以树形式执行文件浏览器并且有问题以某种方式对其进行排序。 我使用PHP和MySQL。我用以下字段创建了混合(嵌套set + adjacency)表'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代码(<ul><li>... and so on).来显示树。

现在回到问题(最后,嗯?)。我正在努力添加排序功能。 例如,我想按尺寸订购我的结果。在这里,我需要牢记树和规则的整个层次结构:文件夹优先,文件稍后。

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

SELECT * FROM element WHERE parent_id = {$parentId} ORDER BY element_type (so folders would be first), size (or name for example) asc/desc

之后对于每个有type ='folder'的结果,我会发送另一个查询来获取它的内容。

也可以通过left_key获取整个树,然后在PHP中将其排序为数组,但我想这会更糟糕:)

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

1 个答案:

答案 0 :(得分:0)

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

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

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