Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос на выборку с подсчетом 
:(
    Опции темы
SDEVIL
Дата 3.6.2010, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 30.10.2006

Репутация: нет
Всего: 1



Есть такая таблица:
Код

id, parent, name

В которой хранятся разделы каталога.
Можно как либо одним запросом получить список разделов у которых `parent`=0, и одновременно для разделов подсчитать количество потомков?
Т.е. к примеру:

Код

1, 0, 'Первый раздел'
2, 0, 'Второй раздел'
3, 0, 'Третий раздел'
4, 0, 'Четвертый раздел'
5, 2, 'Подраздел Второго раздела 1'
6, 2, 'Подраздел Второго раздела 2'
7, 4, 'Подраздел  Четвертого раздела'

Что бы в результате было следующее

Код

1, 0, 'Первый раздел', 0
2, 0, 'Второй раздел', 2
3, 0, 'Третий раздел', 0
4, 0, 'Четвертый раздел', 1

Где последняя цифра это количество подразделов у родительского раздела.
Все это вывести в одном запросе...
--------------------
Подпись сбежала к другому юзверю....
PM MAIL   Вверх
azesmcar
Дата 3.6.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Код

select t.id, t.parent, t.name, count(tn.id)
  from test t, test tn
 where t.parent = 0
   and tn.parent = t.id
 group by t.id, t.name, t.parent

?
PM   Вверх
Akina
Дата 3.6.2010, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Каков максимальный уровень вложенности структуры? Он вообще лимитирован?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
azesmcar
Дата 3.6.2010, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(Akina @  3.6.2010,  13:49 Найти цитируемый пост)
Каков максимальный уровень вложенности структуры? Он вообще лимитирован? 

Да кстати, не обратил на это внимания, если больше 1-ого уровня мой код не сработает. И вообще наверное кроме рекурсии никак.
PM   Вверх
Akina
Дата 3.6.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(azesmcar @  3.6.2010,  14:55 Найти цитируемый пост)
вообще наверное кроме рекурсии никак

Хранимка с этим справится без всякой рекурсии.
Впрочем, если уровень вложенности не лимитирован или просто высок - то следует изменить структуру и добавить поле уровня.
Или вообще перейти на nested set.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
azesmcar
Дата 3.6.2010, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(Akina @  3.6.2010,  14:04 Найти цитируемый пост)
Хранимка с этим справится без всякой рекурсии.

каким образом? (если глубина не лимитирована)
PM   Вверх
Akina
Дата 3.6.2010, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Глубина, не лимитированная теоретически, тем не менее в каждый отдельно взятый момент времени лимитирована текущим наполнением таблицы.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DimW
Дата 3.6.2010, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(Akina @  3.6.2010,  14:40 Найти цитируемый пост)
Глубина, не лимитированная теоретически, тем не менее в каждый отдельно взятый момент времени лимитирована текущим наполнением таблицы. 

бла бла бла....

хорошо, на данный момент глубина равна N, спустя некоторое время равна M, еще через 3 часа равна M - 5.

как получить все уровни вложенности без применения рекурсии?
PM MAIL ICQ   Вверх
Zloxa
Дата 3.6.2010, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(DimW @  3.6.2010,  14:59 Найти цитируемый пост)
бла бла бла....

Я так понимаю Akina,  имел в виду что глубина иерархии результирующего набора запроса - величина постоянная.
Цитата(DimW @  3.6.2010,  14:59 Найти цитируемый пост)
как получить все уровни вложенности без применения рекурсии? 

любой рекурсивный алгоритм может быть реализован иттерационно.
Это аксиома smile 

Это сообщение отредактировал(а) Zloxa - 3.6.2010, 17:00


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
azesmcar
Дата 3.6.2010, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(Zloxa @  3.6.2010,  16:58 Найти цитируемый пост)

любой рекурсивный алгоритм реализуется иттерационно.
Это аксиома smile  

реализуется, только некоторые задачи реализуются через одно место, потому их пишут через рекурсию smile 

Цитата(Zloxa @  3.6.2010,  16:58 Найти цитируемый пост)
Я так понимаю Akina,  имел в виду что глубина иерархии результирующего набора запроса - величина постоанная.

?

как она может быть постоянной?
есть дерево
Цитата

root
   node1
   node2
      node1_1
      node1_2
          node1_2_1
          ...

добавляем еще один элемент в node1_2_1, глубина меняется, или мы о разном говорим?
PM   Вверх
Zloxa
Дата 3.6.2010, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(azesmcar @  3.6.2010,  17:02 Найти цитируемый пост)
добавляем еще один элемент в node1_2_1, глубина меняется,

но не в результирующем наборе, который получен до добавления.
Я не знаю точно как это делается в маське, скорее всего ты не сможешь проинсертиться, встанешь на блокировке, пока весь набор данных не отофетчишь.


хотяя... я всегда забываю о грязных чтениях.....


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
azesmcar
Дата 3.6.2010, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(Zloxa @  3.6.2010,  17:07 Найти цитируемый пост)

но не в результирующем наборе, который получен до добавления.

мы кажется совсем о разных вещах говорим

вернемся к вопросу
Цитата(SDEVIL @  3.6.2010,  13:02 Найти цитируемый пост)
для разделов подсчитать количество потомков


напишем для этого функцию
Код

calculate(root_node)

принимает node, считает сколько у него subnode-ов, не непосредственно под ним, а вообще, во всю глубину.

сделали запрос
Код

select name, calculate(id) from table where parent = 0


это же классическая задача итерации по дереву.

SDEVIL
стоит почитать
http://dev.mysql.com/tech-resources/articl...hical-data.html


Это сообщение отредактировал(а) azesmcar - 3.6.2010, 17:21
PM   Вверх
Akina
Дата 3.6.2010, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(azesmcar @  3.6.2010,  18:02 Найти цитируемый пост)
добавляем еще один элемент в node1_2_1, глубина меняется, или мы о разном говорим? 

Имхо о разном. Ибо 
Цитата(DimW @  3.6.2010,  15:59 Найти цитируемый пост)
хорошо, на данный момент глубина равна N, спустя некоторое время равна M, еще через 3 часа равна M - 5.

Меняется? вроде меняется. Однако в тот момент, когда мы посылаем серверу запрос, вложенность равна некоему вполне определённому (пусть нам и неизвестному) ЗЮ. И это ЗЮ мы выясним в процессе работы нашего запроса/процедуры/прочего (буде оно нам надо - а коли нет, будем просто итерачить или рекурсить, пока вложенность не закончится).
Применительно к именно поставленной задаче - посчитать потомков - рекурсия как раз менее предпочтительна, особенно в случае неопределённой вложенности. Итерации просто будут плюсить наш единственный на всю процедуру каунтер, в то время как рекурсия вынуждена будет гонять текущее неполное количество сквозь стек, чтобы на каждом шаге добавлять количество с очередной ветки очередного уровня.

Цитата(azesmcar @  3.6.2010,  18:14 Найти цитируемый пост)
напишем для этого функцию

А вот функция может быть только итеративная, в отличие от процедур, которые допускают рекурсию... 

PS. Правда, у меня простейшая рекурсивная процедура запросто валила сервер где-то на уровне вложенности порядка 80... может, конечно, что не донастроил или ресурсов не хватило - доки говорят, что уж 200-то должно было выдержать.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1273 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.