MySQL Query for Closure Table - PullRequest
       33

MySQL Query for Closure Table

1 голос
/ 09 сентября 2011

Текущая таблица USER:

Field       Type        
id      int(11)     
firstname   varchar(64)     
lastname    varchar(64)     
status      varchar(5)  
permission  smallint(5) 

Текущая таблица USER_RELATIONS: (она имеет 2 КЛЮЧА FOREIGN - ancestor-> USER.id - Потомок-> USER.id)

Field       Type 
relationId  int(11)
ancestor    int(11)
descendant  int(11)
length      int(11)

Текущая таблица транзакций: (она имеет 1 FOREIGN KEY - chid-> USER.id)

Field   Type
id  int(11)
chid    int(11)
date    date
amt     varchar(16)

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

Ранее я пытался правильно настроить эту настройку и получил большую помощь от «Puggan Se», который указывал мне в направлении таблиц закрытия.

В настоящее время я вижу целое дерево для одного исходного реферера (предка) со всеми его рецензируемыми пользователями (потомком).Мы также настроили систему автоматического выравнивания, которая будет выравнивать каждого пользователя, который сослался на предварительно определенное количество потомков.

Мы добавили магазин и хотели бы дать каждому пользователю что-нибудь для своих ссылок.и приглашая других пользователей присоединиться и делать покупки.«Маленькое что-то» - это, в основном, процент от продажи, основанный на их древовидной структуре.

Объяснил:

1: A invited B, C & D -> B invited E,F -> C invited G -> D invited no-one
2: A moves to status=2(because he invited 3) -> B moves to status=1 (cause he invited 2)-> C & D remain on status=0 (because minimum required invites = 2)
3: Now when B, C & D purchases something from the shop, A should ge a little something back. Because A is status 2, he will get X % for all status=1 sales and Y % for all status=0 sales
4: In the event that B surpases A in status, A will NOT get a "little something" back.
5: status=0 levels do not get something back.

Вопрос: Я хочу, чтобы кто-то просмотрел запрос MySQL и сказал мне,Я делаю это правильно.Я хочу получить общую сумму транзакций и общую сумму расходов всех потомков в дереве предка, где статус потомка <статус предка.Может кто-нибудь, пожалуйста, помогите?В настоящее время я запускаю его 4 раза для каждого отношения. Длина / статус = так как на 4 уровня ниже самого высокого, который равен 4. </p>

Запрос:

select COUNT(*) as total, SUM(amt) as amount from transactions
  left join card_holders_relations as t1 on transactions.chid = t1.descendant
  left join card_holders as t2 on t2.id = t1.descendant
  where t1.ancestor = '3'
  AND t2.status = 0
  AND t1.length = 4;

Теперь каждый раз, когда t2.status увеличивается до НЕ равного статусу предка, а длина t1.length уменьшается до 1, так как length = 0 - это сам предок.

Верны ли мои предположения и методы или есть более простой способ сделать это?

...