Sql Самостоятельный запрос? Как получить категории подкатегории? - PullRequest
4 голосов
/ 14 февраля 2011

У меня есть таблица базы данных, которая имеет следующую форму

catID | category      | parentID
1     | firstCategory | null
2     | SubCategory1  | 1
3     | SubCategory2  | 1
4     | subSub1       | 3

и т. Д. *

Существует несколько уровней категорий.Какой запрос можно использовать для получения записей в следующем формате:

catID | category 
1     | firstCategory
2     | firstCategory/SubCategory1
3     | firstCategory/SubCategory2
4     | firstCategory/SubCategory2/subSub1

Идентификатор категории будет идентификатором последней категории.Как написать запрос для объединения категорий на всех уровнях?Точное количество уровней для разных категорий отличается?

Я использую mySQL.

Ответы [ 3 ]

2 голосов
/ 14 февраля 2011

Для максимальной глубины 6 (включая корень) вы можете использовать это

select l0.catID,
    concat(
      case when l5.catID is null then '' else concat(l5.category, '/') end
    , case when l4.catID is null then '' else concat(l4.category, '/') end
    , case when l3.catID is null then '' else concat(l3.category, '/') end
    , case when l2.catID is null then '' else concat(l2.category, '/') end
    , case when l1.catID is null then '' else concat(l1.category, '/') end
    , l0.category)
from catcat l0
left join catcat l1 on l0.parentID=l1.catID
left join catcat l2 on l1.parentID=l2.catID
left join catcat l3 on l2.parentID=l3.catID
left join catcat l4 on l3.parentID=l4.catID
left join catcat l5 on l4.parentID=l5.catID

Разверните шаблон в соответствии с требованиями для большей максимальной глубины.

0 голосов
/ 14 февраля 2011

Существует альтернатива тому, что сказал cyberkiwi: запрос всей таблицы и построение дерева в памяти.Императивные языки хорошо подходят для этого, а SQL - нет.Производительность будет намного лучше (потому что SQL должен сканировать таблицу не только один раз, но и для каждого уровня).

0 голосов
/ 14 февраля 2011

Oracle обладает этой функциональностью, и компания, в которой я работаю, использует ее именно для того, что вы описываете. Однако запросы могут быть довольно тяжелыми. Хорошая рецензия на функции («начать с» и «соединять по» ключевым словам) находится здесь по этой ссылке, наряду с псевдокодом, который вы могли бы попытаться обернуть вокруг себя ... хотя ответ cyberkiwi, вероятно, подойдет для всех практических цели ...

http://www.adp -gmbh.ch / ора / SQL / connect_by.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...