MySQL Query for Closure Table

Текущая таблица 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 - downndant->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.

Запрос:

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 - это сам предок.

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

0 ответов

Другие вопросы по тегам