Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Партнерская программа: получить количество рефералов n-уровней
 
 автор: p.pavluxa   (25.08.2012 в 11:14)   письмо автору
 
 

Здравствуйте, уважаемые пользователи форума! Пишу партнерскую программу, и стоит задача получить количество рефералов по n-уровням. Как данная задача реализовуется на чистом MYSQL?

Пример подсчета количества для 2-го уровня:

'SELECT COUNT(*) FROM `Users` WHERE `ID` IN (SELECT `ID` FROM `Users` WHERE `partnerID` IN (SELECT `ID` FROM `Users` WHERE `partnerID` = [id человека чьего рефералов считаем]))'

  Ответить  
 
 автор: Sfinks   (26.08.2012 в 14:31)   письмо автору
 
   для: p.pavluxa   (25.08.2012 в 11:14)
 

Зависит от того, как у вас организовано хранение дерева рефералов.
Советую прочесть (http://www.getinfo.ru/article610.html), разобраться и сделать по такому принципу.
Тогда можно одним простым запросом выбрать много чего интересного.

  Ответить  
 
 автор: p.pavluxa   (26.08.2012 в 17:25)   письмо автору
 
   для: Sfinks   (26.08.2012 в 14:31)
 

Жестко. У меня всё проще. Есть таблица Users в ней 2 поля: id пользователя, id реферера. И нужно составить запрос который посчитает всех рефералов у определенного реферера (до n уровня).

  Ответить  
 
 автор: Sfinks   (26.08.2012 в 17:52)   письмо автору
 
   для: p.pavluxa   (26.08.2012 в 17:25)
 

Я догадался, что у вас именно так....
И вот это и есть жестко! =))

Представьте что через год у вас n будет равно 132.
Вам придется делать рекурсию. Т.е. 132 вложенных запроса.
При чем в MySQL рекурсия не реализована.... Следовательно рекурсию будете реализовывать на клиенте. Следовательно будет 132 запроса к MySQL-серверу, 132 ответа и 132 обработки ответов.
Если вам это нравится, то пожалуйста.

Если же потратить время на разбор алгоритма в начале проекта и все сделать правильно, то вы сможете "посчитать всех рефералов до 132го уровня" одним запросом. И много чего еще узнать также одним запросом.

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

Решать вам.

  Ответить  
 
 автор: p.pavluxa   (27.08.2012 в 14:19)   письмо автору
 
   для: Sfinks   (26.08.2012 в 17:52)
 

Прочитал, и не понял :-(

Это о том что нужно создать ещё одну таблицу в которой хранить кто для кого какого уровня реферал?

  Ответить  
 
 автор: Sfinks   (28.08.2012 в 00:07)   письмо автору
 
   для: p.pavluxa   (27.08.2012 в 14:19)
 

Совсем не обязательно. Можно в вашу добавить 3 поля: Left_key, right_key и level. А id реферера можно и убрать. А можно оставить, для простых запросов типа "кто родитель (реферал) на ближайшем уровне".

  Ответить  
 
 автор: p.pavluxa   (28.08.2012 в 01:47)   письмо автору
 
   для: Sfinks   (28.08.2012 в 00:07)
 

Обьясните пожалуйста, что в этих трёх плях нужно хранить? Я внимательно прочитал статью на которую Вы дали ссылку, но не понял идеи.

  Ответить  
 
 автор: Sfinks   (28.08.2012 в 10:00)   письмо автору
26.3 Кб
 
   для: p.pavluxa   (28.08.2012 в 01:47)
 

Не уверен, что смогу объяснить лучше, чем написано в той статье, т.к. сам лучшего описания не встречал. Но попробую.

К примеру есть небольшое дерево. Изображу сперва в вашей системе:
id | parent_id
--------------
1  | null
2  | 1
3  | 1
4  | 1
5  | 2
6  | 2
7  | 3
8  | 3
9  | 3
10 | 4
11 | 4

Теперь в системе из статьи.
Поля level - уровень вложенности элементов. Тут, думаю без проблем. У id=1 level=1, y id 2,3,4 level=2, y id 5,6,7,8,9,10,11 level=3.
Теперь left_key и right_key. Эти цифры означают сколько таких же ключей расположено в дереве соответственно левее элемента и правее него. Расставляются они так: начинается обход дерева с левого ключа самого верхнего элемента. Далее идет движение по всем элементам дерева по его внешнему контуру с заходом во все ветки слева направо. Нарисовал порядок обхода как смог (см.прикрепленный файл). На входе в элемент +1 к левому ключу, на выходе +1 к правому ключу.
Поехали: верхний элемент у нас id=1. Его левый ключ 1. Далее идем по левой границе дерева вниз: ниже id=2 левый ключ = 2, ниже ид=5 - ЛК=3, ниже ничего нет, заполняем правый ключ = 4. идем направо. Правее ид=6, заполняем ЛК=5. Ниже ничего - правый ключ=6, правее ничего, возвращаемся наверх в ид=2 и заполняем его правый ключ=7. Идем направо ид=3, ЛК =8. Вниз ид=7, ЛК=9, ПК=10. Правее ид=8, ЛК=11, ПК=12. Правее ид=9, ЛК=13, ПК=14. Возвращаемся в ИД=3, правый ключ =15. Направо: ид=4, ЛК=16. Вниз.ид=10, ЛК=17, ПК=18. Правее ид=11, ЛК=19, ПК=20. Возвращаемся в ид=4, ПК=21. Возвращаемся в ид=1, ПК=22.
Все. Получаем таблицу:
id | LK | RK | level
--------------------
1  | 1  | 22 | 1
2  | 2  | 7  | 2
3  | 8  | 15 | 2
4  | 16 | 21 | 2
5  | 3  | 4  | 3
6  | 5  | 6  | 3
7  | 9  | 10 | 3
8  | 11 | 12 | 3
9  | 13 | 14 | 3
10 | 17 | 18 | 3
11 | 19 | 20 | 3

Теперь как нам узнать сколько детей (рефералов) у элемента с ид=3? Легко:
SELECT count(*) FROM table WHERE LK>8 AND RK <15
Ответ: 3

Сколько рефералов у ид=1 на 3-ем уровне вложенности?
SELECT count(*) FROM table WHERE LK>1 AND RK <22 AND level=3
Ответ: 7

Остальные варианты выборок и запросы на управление деревом смотрите в статье.

  Ответить  
 
 автор: p.pavluxa   (28.08.2012 в 14:32)   письмо автору
 
   для: Sfinks   (28.08.2012 в 10:00)
 

Жестоко (
А какой класс подскажите на PHP что бы со всем этим работать?

  Ответить  
 
 автор: Sfinks   (30.08.2012 в 11:55)   письмо автору
 
   для: p.pavluxa   (28.08.2012 в 14:32)
 

Мне проще свой класс написать, чем в чужом разобраться.
Соответственно я не подскажу.
гугл вам в помощь =)

  Ответить  
 
 автор: p.pavluxa   (30.08.2012 в 13:11)   письмо автору
 
   для: Sfinks   (30.08.2012 в 11:55)
 

О великий гугл зол

  Ответить  
 
 автор: p.pavluxa   (30.08.2012 в 15:37)   письмо автору
 
   для: p.pavluxa   (30.08.2012 в 13:11)
 

Всё разработался. Всем спасибо за помощь!

  Ответить  
 
 автор: p.pavluxa   (30.08.2012 в 15:59)   письмо автору
 
   для: p.pavluxa   (30.08.2012 в 15:37)
 

Подскажите пожалуйста как одним запросом получить количество рефералов по n-уровням (по отдельности)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования