| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MySQL > Запрос на выборку с подсчетом |
| Автор: SDEVIL 3.6.2010, 13:02 | ||||||
Есть такая таблица:
В которой хранятся разделы каталога. Можно как либо одним запросом получить список разделов у которых `parent`=0, и одновременно для разделов подсчитать количество потомков? Т.е. к примеру:
Что бы в результате было следующее
Где последняя цифра это количество подразделов у родительского раздела. Все это вывести в одном запросе... |
| Автор: azesmcar 3.6.2010, 13:10 | ||
? |
| Автор: Akina 3.6.2010, 13:49 |
| Каков максимальный уровень вложенности структуры? Он вообще лимитирован? |
| Автор: Akina 3.6.2010, 14:04 |
Хранимка с этим справится без всякой рекурсии. Впрочем, если уровень вложенности не лимитирован или просто высок - то следует изменить структуру и добавить поле уровня. Или вообще перейти на nested set. |
| Автор: azesmcar 3.6.2010, 14:12 |
каким образом? (если глубина не лимитирована) |
| Автор: Akina 3.6.2010, 14:40 |
| Глубина, не лимитированная теоретически, тем не менее в каждый отдельно взятый момент времени лимитирована текущим наполнением таблицы. |
| Автор: DimW 3.6.2010, 14:59 | ||
бла бла бла.... хорошо, на данный момент глубина равна N, спустя некоторое время равна M, еще через 3 часа равна M - 5. как получить все уровни вложенности без применения рекурсии? |
| Автор: Zloxa 3.6.2010, 16:58 |
Я так понимаю Akina, имел в виду что глубина иерархии результирующего набора запроса - величина постоянная. любой рекурсивный алгоритм может быть реализован иттерационно. Это аксиома |
| Автор: azesmcar 3.6.2010, 17:02 | ||||||
реализуется, только некоторые задачи реализуются через одно место, потому их пишут через рекурсию
? как она может быть постоянной? есть дерево
добавляем еще один элемент в node1_2_1, глубина меняется, или мы о разном говорим? |
| Автор: Zloxa 3.6.2010, 17:07 |
но не в результирующем наборе, который получен до добавления. Я не знаю точно как это делается в маське, скорее всего ты не сможешь проинсертиться, встанешь на блокировке, пока весь набор данных не отофетчишь. хотяя... я всегда забываю о грязных чтениях..... |
| Автор: azesmcar 3.6.2010, 17:14 | ||||
мы кажется совсем о разных вещах говорим вернемся к вопросу напишем для этого функцию
принимает node, считает сколько у него subnode-ов, не непосредственно под ним, а вообще, во всю глубину. сделали запрос
это же классическая задача итерации по дереву. SDEVIL стоит почитать http://dev.mysql.com/tech-resources/articles/hierarchical-data.html |
| Автор: Akina 3.6.2010, 17:45 | ||||
Имхо о разном. Ибо
Меняется? вроде меняется. Однако в тот момент, когда мы посылаем серверу запрос, вложенность равна некоему вполне определённому (пусть нам и неизвестному) ЗЮ. И это ЗЮ мы выясним в процессе работы нашего запроса/процедуры/прочего (буде оно нам надо - а коли нет, будем просто итерачить или рекурсить, пока вложенность не закончится). Применительно к именно поставленной задаче - посчитать потомков - рекурсия как раз менее предпочтительна, особенно в случае неопределённой вложенности. Итерации просто будут плюсить наш единственный на всю процедуру каунтер, в то время как рекурсия вынуждена будет гонять текущее неполное количество сквозь стек, чтобы на каждом шаге добавлять количество с очередной ветки очередного уровня. А вот функция может быть только итеративная, в отличие от процедур, которые допускают рекурсию... PS. Правда, у меня простейшая рекурсивная процедура запросто валила сервер где-то на уровне вложенности порядка 80... может, конечно, что не донастроил или ресурсов не хватило - доки говорят, что уж 200-то должно было выдержать. |