如何选择以下?

时间:2011-03-07 23:34:04

标签: mysql sql select nested-sets

我有一张表DOCUMENTS和一张表FOLDERS

FOLDERS
ID
lft
rgt

DOCUMENTS
ID
folderID -> FOLDERS(ID)
title

所以,我们这里有一个任意深度的文件夹树(嵌套集)。每个文件夹可以包含任意数量的文档。

选择某个文件夹中的所有文档的最有效方法是什么?也就是说,我不仅要选择文件夹中的文档,还要选择该文件夹子文件夹中的文档。

编辑:示例数据以使事情更加清晰:

FOLDERS
ID     LFT     RGT
1      1       10      
2      2       5
3      3       4
4      6       7
5      8       9

这表示像这样的文件夹结构......

       1
    2  4  5
 3

其中2,4,5是1的孩子,3是2的孩子

现在...

假设DOCUMENTS有以下数据......

DOCUMENTS
ID     FolderID    Title
1      5           Doc 1
2      3           Doc 2
3      2           Doc 3

鉴于文件夹的ID,我想要选择该文件夹中的所有文档,以及该文件夹的子文件夹中的所有文档。因此,例如,如果folderID为2,则SELECT将返回文档2和3

先谢谢你的帮助

1 个答案:

答案 0 :(得分:0)

首先,您需要从文件夹表中获取lftrgt值:

select lft, rgt from folders where id = 2;

...然后使用它们来识别该节点或其子节点中存在的文档:

select d.* from documents d left join folders f on f.id = d.folderID where f.lft >= 2 and f.rgt <= 5;

您可以在代码中单独调用这两个查询,可以将它们与子查询结合使用,也可以编写一个将它们组合在一起的存储过程。