2011-03-07 3 views
1

У меня есть таблица документы и таблица СКОРОСШИВАТЕЛИКак выбрать для следующего?

FOLDERS 
ID 
lft 
rgt 

DOCUMENTS 
ID 
folderID -> FOLDERS(ID) 
title 

Итак, что мы имеем здесь сколь угодно глубокое дерево папок (вложенные наборы). Каждая папка может содержать произвольное количество документов.

Каков наиболее эффективный способ выбора всех документов, находящихся под определенной папкой? То есть, я хочу ВЫБРАТЬ не только документы, находящиеся в папке, но и документы, находящиеся в подпапках этой папки.

Edit: Выборочные данные, чтобы сделать вещи более ясно:

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 
ID  FolderID Title 
1  5   Doc 1 
2  3   Doc 2 
3  2   Doc 3 

Учитывая идентификатор папки, я хочу, чтобы выбрать все документы в этой папке, и все документы в подпапках этой папки. Так, например, дано folderID из 2, SELECT, будет возвращать документы 2 и 3

спасибо (заранее) за помощь

+0

Как насчет некоторых выборочных данных и желаемых результатов для этих данных? Ваш вопрос, как указано, слишком расплывчато. –

+0

@mellamokb, это изменено. Предпросмотр дерева обхода: http://dev.mysql.com/tech-resources/articles/hierarchical-data.html – Schwartzie

ответ

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; 

Вы ча n вызывать эти два запроса отдельно в своем коде, вы можете комбинировать их с подзапросами или вы можете написать хранимую процедуру, которая их объединяет.

+0

затем выполните ту же процедуру для папок lft и rgt, и это папки lft/rgt, и это папки lft/rgt, и это папки lft/rgt? –

+0

Ах, красивый. Простой и элегантный. Благодаря! –

+0

@Nicklamort. Во вложенном наборе значения вложенных и подстрочных значений lft и rgt всегда находятся между значениями lft и rgt родительской папки. –