我有一张表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
先谢谢你的帮助
答案 0 :(得分:0)
首先,您需要从文件夹表中获取lft
和rgt
值:
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;
您可以在代码中单独调用这两个查询,可以将它们与子查询结合使用,也可以编写一个将它们组合在一起的存储过程。