Конференция "Базы" » посчитать сумму параметров дочерних эл-тов [D7, XP]
 
  • nachi (01.07.09 11:31) [0]
    Удалено модератором
    Примечание: СПАМ
  • Вариант (01.07.09 12:25) [1]
    update  имя_таблицы_обновления
         set par = (select sum(par) from имя_таблицы_выборки  where parent_id =имя_таблицы_обновления.id)

    Или в запросе у тебя "tablе" в UPDATE и SELECT одна и та же таблица (имя_таблицы_обновления=имя_таблицы_выборки)?
  • nachi (01.07.09 12:42) [2]

    > Или в запросе у тебя "tablе" в UPDATE и SELECT одна и та
    > же таблица (имя_таблицы_обновления=имя_таблицы_выборки)?
    >

    ага
  • Ega23 © (01.07.09 12:42) [3]
    Так это же Level получается. Только помноженный на коэффициент, нет?
  • nachi (01.07.09 12:45) [4]

    > Ega23 ©   (01.07.09 12:42) [3]

    не, значение par может быть любым числом...
  • Ega23 © (01.07.09 12:46) [5]
    Погоди. Вот у меня таблица
    1,null,0
    2,1,0
    3,1,0
    4,2,0
    5,2,0
    6,3,0
    7,3,0

    при любом изменении par у меня должна запускаться рекурсивная обновлялка, которая смотрит, есть ли да данной записи дети. Если есть - обновить им par
  • Ega23 © (01.07.09 12:47) [6]
    Тогда либо триггер, либо ХП (но обновлять тогда уже строго через неё).
  • nachi (01.07.09 12:59) [7]
    да-да, и триггер есть и ХП... не катит... долго.

    а вообще, задача стоит следующая:
    tree_table:
    id, parent_id, par, uniq_par

    text_to_tree:
    tree_id, text_id

    text_to_tree.tree_id - внешний ключ к tree_table
    нужно пересчитывать параметры par и uniq_par следующим образом: каждый параметр par строки дерева равно количеству соответствующих строк в text_to_tree с учетом принадлежности всем дочерним темам. uniq_par - то же самое, только text_id должен быть уникальным в наборе.
    Вроде внятно объяснил. Пока данных было мало, этих полей вообще не существовало - все делал запросом, но, с ростом табличек, пришлось от этого отказаться - слишком долго выполнялся запрос. Теперь, тормозит уже просто обновление. Делал так:

    update content_tree
       set cnt =             (SELECT count(u_txt)
                   FROM text_to_tree
                  WHERE tree_id IN (
                                   SELECT id
                                     FROM all_subj_child (id)
                                   )),
         u_par =             (SELECT SUM(u_txt)
                 FROM text_to_tree
                WHERE tree_id IN (
                                   SELECT id
                                     FROM all_subj_child (id)
                                   )),
         cnt_uniq =   (SELECT COUNT(DISTINCT(text_id))
                  FROM text_to_tree
                 WHERE tree_id IN (
                                   SELECT id
                                     FROM all_subj_child (id)
                                   )
               )   where id in (select id from all_subj_child(@id))

    all_subj_child - функция, возвращающая всех детей ветви.

    Как решить данную проблему? Приведенный код работает жутко медленно... строк - пока сотня тысяч, где-то...
  • nachi (01.07.09 13:08) [8]

    > Вариант   (01.07.09 12:25) [1]

    а вот про from не знал. Спасибо, ща с ним попробую переписать, что выше...
 
Конференция "Базы" » посчитать сумму параметров дочерних эл-тов [D7, XP]
Есть новые Нет новых   [134473   +31][b:0][p:0.001]