[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Хорошо или плохо?
p.pavluxa
Здравствуйте, уважаемые пользователи форума!

Пишу многоуровневую партнерскую программу и наткнулся на вопрос.

Необходимо посчитать количество привлеченных рефералов по каждому уровню.

Для первого уровня код выглядит так:
SELECT COUNT(*) FROM `Users` WHERE `iPartnerID` = <user_id>


Для второго уровня так:
SELECT COUNT(*) FROM `Users` WHERE `iID` IN (SELECT `iID` FROM `Users` WHERE `iPartnerID` IN (SELECT `iID` FROM `Users` WHERE `iPartnerID` = <user_id>))


А для третьего так:
SELECT COUNT(*) FROM `Users` WHERE `iID` IN (SELECT `iID` FROM `Users` WHERE `iPartnerID` IN (SELECT `iID` FROM `Users` WHERE `iPartnerID` IN (SELECT `iID` FROM `Users` WHERE `iPartnerID` = <user_id>)))


Вложенные запросы меня смущают, какие есть варианты их обхода?



Спустя 30 минут, 40 секунд (30.08.2012 - 09:53) Placido написал(а):
Это проблема хранения древовидных структур в реляционных БД. Вариант 1 - написать хранимую процедуру, которая будет рекурсивно выбирать рефералов. Вариант 2 - сменить способ хранения данных с adjacency list на nested sets или materialized path. Подробнее можно почитать здесь.

UPD
Если это не MySQL, а Postgre или MSSQL, то можно использовать CTE для организации рекурсивного запроса, MySQL рекурсивные запросы не поддерживает.

Спустя 1 час, 46 минут, 46 секунд (30.08.2012 - 11:40) dron4ik написал(а):
копай в сторону дерева... один раз сделать, и всю жизнь радоваться)

Спустя 15 минут, 1 секунда (30.08.2012 - 11:55) p.pavluxa написал(а):
Помогите

Спустя 49 минут, 55 секунд (30.08.2012 - 12:45) sergeiss написал(а):
Цитата (p.pavluxa @ 30.08.2012 - 13:55)
Помогите

Вот тут http://phpforum.ru/index.php?showtopic=31806&hl= - моя тема, как на Постгре решается эта задача. И там же в теме были ссылки на подобные решения в Мускуле.

Спустя 1 час, 55 минут, 29 секунд (30.08.2012 - 14:41) p.pavluxa написал(а):
Всем спасибо! Вопрос решен при помощи статьи http://www.getinfo.ru/article610.html
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.