Задавайте вопросы, мы ответим
Вы не зашли.
Вот такая таблица:
CREATE TABLE IF NOT EXISTS `mlm_network` (
`uid` int(11) NOT NULL default '0',
`uid_sponsor_1` int(11) NOT NULL default '0',
`level_1` int(11) NOT NULL default '0',
`lo` float(16,5) NOT NULL default '0.00000',
`go_1` float(16,5) NOT NULL default '0.00000',
PRIMARY KEY (`uid`),
UNIQUE KEY `uid` (`uid`),
KEY `id_period` (`id_period`,`id_period_reg`)
)
Это база просчета по маркетинговому плану для сетевой компании.
Задача такая, нужно для всех пользователей просчитать их товарооборот.
Т.е. товарооборот для каждого всех тех, кто в его структуре, естественно с низу в верх.
UPDATE mlm_network n1 SET n1.go_1 = (SELECT SUM(n2.lo) + SUM(n2.go_1) AS go FROM mlm_network n2 WHERE n2.uid_sponsor_1 = n1.uid GROUP BY n2.uid_sponsor_1) ORDER BY n1.level_1 DESC
MySql не дает сделать двойной запрос в одну таблицу, а я не пойму как сделать иначе.
Смысл в том, что надо пересчитать всех пользователей сортируя по level_1 от большего к меньшему (т.е. с верху в низ)
И верхним, топишь спонсорам в их go_1 передавать сумму всех их lo и go_1
Можно конечно сделать через while , но хочется и красиво и оптимизировано.
Буду благодарен за помощь!
Отредактированно Alex554 (18.11.2010 23:24:07)
Неактивен
Брр, что-то я вообще ничего не понял
Ощущение, что у Вас есть дерево, записанное в таблице. Вы хотите посчитать
сумму значений столбца по соответствующим ветвям.
Если так — то Вам нужно написать хранимую процедуру (или функцию), которую
нужно запускать рекурсивно от верхушки дерева.
Неактивен
Да, так оно и есть, только запускать ее надо не от верхушки, а с низу в верх, поэтому n1.level_1 DESC
Но на мой взгляд проблема вот в чем:
К примеру сумма оборотов текущего уровня апдейтится в следующий уровень и уже участвует в запросе на следующем уровнеи так далее.
Но я так понял, если пользоваться LEFT JOIN, то снимается копия таблицы, и если при просчете следующей строки, новые данные, которые только были обновлены уже в снимке таблицы отсутствуют.
А сам UPDATE не позволяет (или я не знаю как это сделать) обновляя текущую таблицу в цикле запроса иметь как операнды результат предыдущей части цикла.
Может кто знает как правильно обратиться к скуле?
Неактивен
К скуле надо обращаться в звательном падеже. Например, так:
«О, великая скула, да не выпадут зубы из тебя»
Пусть у Вас дерево состоит всего из трех элементов: A, B и C.
При этом B и C являются дочерними элементами элемента А.
Вопрос — снизу вверх — это от B или от C? И почему?
Неактивен
Что то я вообще вопроса не понял.
Объясняю суть, чего надо:
Есть база дистрибьюторов, табла такая:
1. ИД партнера.
2. ИД спонсора (кто его пригласил)
3. Уровень от начала компании (на данный момент у нас двадцать уровней) У каждого следующего партнера уровень на 1 больше чем у человека, кто его пригласил.
4. Личный Объем Закупок за месяц
5. Групповой Объем закупок за месяц.
Собственно а нужно следующее:
Запустить цикл по Уровню Партнера (3), от большего к меньшему, т.е. с низу в верх
Далее суммируем Личный и Групповой Объем каждого Партнера в уровне и записываем в групповой объем пригласившего его партнера, т.е. тому чей ид у него в ячейке - 2. ИД спонсора.
Переходим к следующему уровню (ну в смысле DESC).
В принципе это все.
Неактивен
И чем Вам не нравится идеология «групповой объем — это сумма личных объемов
в поддереве»?
Неактивен
да мне все нравится мне нужен совет, как все это дело в одном запросе сделать!
Неактивен