Обновление всех веток одним запросом в nested sets

alexeyco

Новичок
Обновление всех веток одним запросом в nested sets

Добрый день!

Не ради того, чтобы сделать базу избыточной, а для экономии нагрузки я внес в стандартную модель базы данных nested sets поле parent, где хранится id родительского узла. Точно так же - для экономии ресурсов мне необходимо внести в модель поле count, где хранились бы данные о количестве вложенных узлов (имеется в виду - тех узлов, которые находятся на один уровень ниже и имеют своим родителем текущий узел). Понимаете, да? В первом случае при переносе узлов, добавлении их и прочем проблем не возникает, да и не может.

Проблема во втором случае. Я пытаюсь нащупать - как обновить поле count по всему дереву одним запросом. Почему я не прибегаю к внутренним процедурам - потому, что решение должно быть потенциально, ансишное и переносимое на большинство других основных СУБД, ибо я не уверен в том, что выбор постгри у нас последний.

Я пытаюсь вот, что сделать:
Код:
UPDATE
  categories
SET
  category_count = (
    SELECT 
      COUNT(с.category_id)
    FROM
      categories as c
    WHERE
      c.category_parent = category_id
)
Конечно, при добавлении можно пересчитать только значение поля count родителя, при переносе - только двух id - старого и нового родителей. При удалении, соответственно... Я, вероятно, уже так и сделаю... Но в чем, объясните, пожалуйста, моя ошибка?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: alexeyco
Проблема во втором случае. Я пытаюсь нащупать - как обновить поле count по всему дереву одним запросом. Почему я не прибегаю к внутренним процедурам - потому, что решение должно быть потенциально, ансишное и переносимое на большинство других основных СУБД, ибо я не уверен в том, что выбор постгри у нас последний.
Рекомендую установить MySQL 3.23 и потренироваться на ём: гораздо проще писать потенциально переносимый потенциально ансишный потенциальный код на большинство более других основных СУБД. И опять же, прибечь к внутренним процидуркам сложнее.

"Постгри" нету, есть Постгрес.
 

alexeyco

Новичок
Господи Боже мой, сколько пафоса )))

Не всегда те, кто ставят задачу могут явно объяснить (подчеркиваю - не не хотят, а не могут) почему задача именно такая... не всегда у тех, кто исполняет задачу есть возможность образумить тех, кто эту задачу ставит.

А так же еще есть опыт и профессионализм, которые говорят, что надо - всегда надо оставлять возможности. Хотя что объяснять человеку, который придрался к двум буквам, а на запятые в собственном сообщении почти забил. Да и слово "процедурки" тоже как-то... странно пишет.

Вероятнее всего, такому человеку слова "профессионализм" и "опыт" ничего не скажут, ведь по сабжу с его стороны не написано ни слова.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: alexeyco
Не всегда те, кто ставят задачу могут явно объяснить (подчеркиваю - не не хотят, а не могут) почему задача именно такая... не всегда у тех, кто исполняет задачу есть возможность образумить тех, кто эту задачу ставит.
Не всегда у тех, кто читает вопрос в форуме, есть желание (подчёркиваю --- не умение, а желание) давать ответ на задачу, сформулированную как "Мне СРОЧНО надо забить гвоздь при помощи микроскопа". Ибо заказчик, имея с тобой орально-церебральный секс, по крайней мере его оплачивает. А тут ты, вероятно, надеешься по любви?..

А так же еще есть опыт и профессионализм, которые говорят, что надо - всегда надо оставлять возможности. Хотя что объяснять человеку, который придрался к двум буквам, а на запятые в собственном сообщении почти забил. Да и слово "процедурки" тоже как-то... странно пишет.
Не любишь процидурки? А зря, в больнице имени П.П.Кащенко с помощью процидурок творят буквально чудеса, превращая вчерашних веб-программистов в полноценных членов общества.

Ну и рекомендую провести экскремент, задав вопрос в форуме по Линуксу и употребив в вопросе слово "люникс", "линупс" или "лялих".

Вероятнее всего, такому человеку слова "профессионализм" и "опыт" ничего не скажут, ведь по сабжу с его стороны не написано ни слова.
Выйди во двор, подойди к песочнице, там найдёшь благодарную аудиторию для взятия на слабо и АНАЛогичных полемических приёмов.
 

alexeyco

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

Adelf

Administrator
Команда форума
Я конечн не эксперт и выдам ща решение бездумное опять, но я люблю чтобы все было ясно и однозначно:

PHP:
UPDATE
  categories с2
SET
  category_count = (
    SELECT 
      COUNT(с.category_id)
    FROM
      categories as c
    WHERE
      c.category_parent = с2.category_id
)
 

tf

крылья рулят
Adelf, с какого перепугу ты тут во все темы пишеш нерабочий код?
возми в руки базу и выполни его, потом предлогай

-~{}~ 11.08.09 14:47:

alexeyco, неадекват, только хамить и умеем, вот ответов и нет
 

alexeyco

Новичок
Я на самом деле уже нашел вариант... вот он:

[SQL]UPDATE promo_categories
SET
category_cat_count = (
SELECT
COUNT(c.category_id)
FROM
promo_categories as c
WHERE
c.category_parent = promo_categories.category_id
)[/SQL]

Конечно, необходимость шуршать по всему дереву спорная, но вопрос вставал не о том, чтобы решить какую-то задачу наиболее оптимальным способом, а о том, чтобы решить ее таким способом, который предложен не взирая на то, что кто-то очень буквален и еще не бреется даже. Спасибо за помощь ))))

-~{}~ 11.08.09 14:54:

tf
Не правда. Я никого не торопил, никого не оскорблял первым.

-~{}~ 11.08.09 15:02:

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

Adelf

Administrator
Команда форума
Adelf, с какого перепугу ты тут во все темы пишеш нерабочий код?
возми в руки базу и выполни его, потом предлогай
1) У меня нет с собой постгреса.
2) Я вполне могу дать своим кодом правильную наводку даже если синтаксис и даже сама идея неправильная. Между прочим так примерно и получилось бы. Решение почти такое же.
3) При выборе между попыткой помочь и правилом форума я выберу первое.
 

tf

крылья рулят
ансишное и переносимое на большинство других основных СУБД
так учись читать, посмотри на ошибки в mysql
3) При выборе между попыткой помочь и правилом форума я выберу первое.
какой помочь? предлогая кривой, нерабочий в принципе код?
2) Я вполне могу дать своим кодом правильную наводку даже если синтаксис и даже сама идея неправильная. Между прочим так примерно и получилось бы. Решение почти такое же.
это типо учить новичка делать все через задний проход?
Да. Я готов поверить, что бывают случаи, когда удаление зубов автогеном через задний проход является рациональным. (c) Crazy
 

Adelf

Administrator
Команда форума
какой помочь? предлогая кривой, нерабочий в принципе код?
Единственное отличие моего кода от ТС в том, что полю category_id было явно указана принадлежность(пусть и кривым способом). Так в итоге у него и получилось. Прекращайте нудеть попусту.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Напоследок хочу обратить внимание нашего взрослого воспитанного гладко выбритого коллеги, что в версии 8.4 постгреса реализован анси-стандартный механизм рекурсивных запросов, который позволит легко выбирать деревья в модели adjacency list (это который с parent_id, если кто не понял) выкинуть "доработанный nested sets", а если повезёт, то и избавиться от его разработчика.

Ну а почему исходный запрос не работал, тут уже, к сожалению, объяснили: у поля category_id не была указана принадлежность к внешней таблице, и потому оно считалось относящимся к таблице из подзапроса.
 

tf

крылья рулят
Adelf, ну и идите оба учить мат часть, раз запросы одинаковые сделали
 

alexeyco

Новичок
Хмэхэхэ.. это я ото всех могу избавиться )) от меня никто не избавится
ЗЫ
Быть закомплексованным злоблым ....ком тяжело - сам таким был, помню ))))
 

tf

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

-~{}~ 12.08.09 15:30:

ps/ тему пора прикрыть из за неадекватности и оскорблений
 

alexeyco

Новичок
Определенно ))) оскорбления должны быть адекватными... но я по средам не матерю никого, даже если вы это заслуживаете
 
Сверху