|
|
|
| Здравствуйте, уважаемые пользователи форума! Пишу партнерскую программу, и стоит задача получить количество рефералов по n-уровням. Как данная задача реализовуется на чистом MYSQL?
Пример подсчета количества для 2-го уровня:
'SELECT COUNT(*) FROM `Users` WHERE `ID` IN (SELECT `ID` FROM `Users` WHERE `partnerID` IN (SELECT `ID` FROM `Users` WHERE `partnerID` = [id человека чьего рефералов считаем]))'
|
| |
|
|
|
|
|
|
|
для: p.pavluxa
(25.08.2012 в 11:14)
| | Зависит от того, как у вас организовано хранение дерева рефералов.
Советую прочесть (http://www.getinfo.ru/article610.html), разобраться и сделать по такому принципу.
Тогда можно одним простым запросом выбрать много чего интересного. | |
|
|
|
|
|
|
|
для: Sfinks
(26.08.2012 в 14:31)
| | Жестко. У меня всё проще. Есть таблица Users в ней 2 поля: id пользователя, id реферера. И нужно составить запрос который посчитает всех рефералов у определенного реферера (до n уровня). | |
|
|
|
|
|
|
|
для: p.pavluxa
(26.08.2012 в 17:25)
| | Я догадался, что у вас именно так....
И вот это и есть жестко! =))
Представьте что через год у вас n будет равно 132.
Вам придется делать рекурсию. Т.е. 132 вложенных запроса.
При чем в MySQL рекурсия не реализована.... Следовательно рекурсию будете реализовывать на клиенте. Следовательно будет 132 запроса к MySQL-серверу, 132 ответа и 132 обработки ответов.
Если вам это нравится, то пожалуйста.
Если же потратить время на разбор алгоритма в начале проекта и все сделать правильно, то вы сможете "посчитать всех рефералов до 132го уровня" одним запросом. И много чего еще узнать также одним запросом.
Кроме того, такая схема хранения деревьев универсальна. И разобравшись с ней 1 раз, потом можно ее использовать и для разветвленного меню сайта, и для меню товаров, и для карты сайта и много для чего еще.
Решать вам. | |
|
|
|
|
|
|
|
для: Sfinks
(26.08.2012 в 17:52)
| | Прочитал, и не понял :-(
Это о том что нужно создать ещё одну таблицу в которой хранить кто для кого какого уровня реферал? | |
|
|
|
|
|
|
|
для: p.pavluxa
(27.08.2012 в 14:19)
| | Совсем не обязательно. Можно в вашу добавить 3 поля: Left_key, right_key и level. А id реферера можно и убрать. А можно оставить, для простых запросов типа "кто родитель (реферал) на ближайшем уровне". | |
|
|
|
|
|
|
|
для: Sfinks
(28.08.2012 в 00:07)
| | Обьясните пожалуйста, что в этих трёх плях нужно хранить? Я внимательно прочитал статью на которую Вы дали ссылку, но не понял идеи. | |
|
|
|
|
 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
Остальные варианты выборок и запросы на управление деревом смотрите в статье. | |
|
|
|
|
|
|
|
для: Sfinks
(28.08.2012 в 10:00)
| | Жестоко (
А какой класс подскажите на PHP что бы со всем этим работать? | |
|
|
|
|
|
|
|
для: p.pavluxa
(28.08.2012 в 14:32)
| | Мне проще свой класс написать, чем в чужом разобраться.
Соответственно я не подскажу.
гугл вам в помощь =) | |
|
|
|
|
|
|
|
для: Sfinks
(30.08.2012 в 11:55)
| | О великий гугл зол | |
|
|
|
|
|
|
|
для: p.pavluxa
(30.08.2012 в 13:11)
| | Всё разработался. Всем спасибо за помощь! | |
|
|
|
|
|
|
|
для: p.pavluxa
(30.08.2012 в 15:37)
| | Подскажите пожалуйста как одним запросом получить количество рефералов по n-уровням (по отдельности) | |
|
|
|