SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.11.2010 23:20:22

Alex554
Участник
Зарегистрирован: 18.11.2010
Сообщений: 4

Помогите составить оптимизированный запрос

Вот такая таблица:

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)

Неактивен

 

#2 19.11.2010 22:25:30

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите составить оптимизированный запрос

Брр, что-то я вообще ничего не понял smile

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

Если так — то Вам нужно написать хранимую процедуру (или функцию), которую
нужно запускать рекурсивно от верхушки дерева.

Неактивен

 

#3 20.11.2010 22:52:12

Alex554
Участник
Зарегистрирован: 18.11.2010
Сообщений: 4

Re: Помогите составить оптимизированный запрос

Да, так оно и есть, только запускать ее надо не от верхушки, а с низу в верх, поэтому n1.level_1 DESC
Но на мой взгляд проблема вот в чем:
К примеру сумма оборотов текущего уровня апдейтится в следующий уровень и уже участвует в запросе на следующем уровнеи так далее.
Но я так понял, если пользоваться LEFT JOIN, то снимается копия таблицы, и если при просчете следующей строки, новые данные, которые только были обновлены уже в снимке таблицы отсутствуют.
А сам UPDATE не позволяет (или я не знаю как это сделать) обновляя текущую таблицу в цикле запроса иметь как операнды результат предыдущей части цикла.
Может кто знает как правильно обратиться к скуле?

Неактивен

 

#4 20.11.2010 23:11:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите составить оптимизированный запрос

К скуле надо обращаться в звательном падеже. Например, так:
«О, великая скула, да не выпадут зубы из тебя» wink

Пусть у Вас дерево состоит всего из трех элементов: A, B и C.
При этом B и C являются дочерними элементами элемента А.
Вопрос — снизу вверх — это от B или от C? И почему?

Неактивен

 

#5 20.11.2010 23:47:27

Alex554
Участник
Зарегистрирован: 18.11.2010
Сообщений: 4

Re: Помогите составить оптимизированный запрос

Что то я вообще вопроса не понял.
Объясняю суть, чего надо:
Есть база дистрибьюторов, табла такая:
1. ИД партнера.
2. ИД спонсора (кто его пригласил)
3. Уровень от начала компании (на данный момент у нас двадцать уровней) У каждого следующего партнера уровень на 1 больше чем у человека, кто его пригласил.
4. Личный Объем Закупок за месяц
5. Групповой Объем закупок за месяц.

Собственно а нужно следующее:
Запустить цикл по Уровню Партнера (3), от большего к меньшему, т.е. с низу в верх
Далее суммируем Личный и Групповой Объем каждого Партнера в уровне и записываем в групповой объем пригласившего его партнера, т.е. тому чей ид у него в ячейке - 2. ИД спонсора.
Переходим к следующему уровню (ну в смысле DESC).
В принципе это все.

Неактивен

 

#6 21.11.2010 00:11:15

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите составить оптимизированный запрос

И чем Вам не нравится идеология «групповой объем — это сумма личных объемов
в поддереве»?

Неактивен

 

#7 21.11.2010 02:20:09

Alex554
Участник
Зарегистрирован: 18.11.2010
Сообщений: 4

Re: Помогите составить оптимизированный запрос

да мне все нравится мне нужен совет, как все это дело в одном запросе сделать!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson