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 - это сам предок.
Верны ли мои предположения и методы или есть более простой способ сделать это?