Пишу многоуровневую партнерскую программу и наткнулся на вопрос.
Необходимо посчитать количество привлеченных рефералов по каждому уровню.
Для первого уровня код выглядит так:
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 рекурсивные запросы не поддерживает.
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