2015-07-10 3 views
0

Мне нужно создать выбор для отображения дерева в HTML в многоуровневой маркетинговой системе. Моя таблица отношения есть:Сделать запрос mysql для многоуровневого маркетинга

Members_relations:

memberID parentID 
1  2 
1  3 
1  4 
5  NULL 
6  NULL 
7  8 
4  7 

Members_sales:

Id Sale 
1 500 
2 300 
3 400 
4 150 
5 200 
6 0 
7 0 
8 0 

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

Как я могу сделать этот запрос? Помните, что это многоуровневая система маркетинга,

+0

Можете ли вы показать, как будет выглядеть ваш желаемый конечный результат? – Sean

+0

, например, член 1 имеет члены 2,3,4 в первой строке выше, но член 4 имеет над ним один элемент id 7, им сначала нужно знать, сколько членов имеет член 1 (в этом случае 4, 3 напрямую и 1 на втором уровне), и мне нужно знать сумму общих продаж от членов выше члена 1 (в этом случае: член 2 = 300, 3 = 400, 4 = 150 и 7 = 0, член 1 имеет 5% от 850 (2 + 3 + 4 + 7)) –

+0

Не слишком любите свои запятые в своих первых блоках. На самом деле у вас нет идентификатора, хранящегося в виде разделенных запятыми списков? Также не должен быть член только 1 родитель? – Drew

ответ

0

Здесь образец решения. Я изменил структуру дерева, чтобы иметь больше смысла отвечать. Быть свободным, чтобы соответствовать коду с точными требованиями (sechema, commisions, ...) в вашей среде.

Members_relations 
parentID memberID <--- OP, be carefull here 
1  2 
1  3 
1  4 
7  8 
4  7 
10  100 

Members_sales: 
Id Sale 
1 500 
2 300 
3 400 
4 150 
5 200 
6 0 
7 0 
8 0 
10 999 
100 888 

Чтобы выяснить это, само вступление в то время как дети обнаружили:

DELIMITER $$ 
DROP PROCEDURE IF EXISTS letsgo; 
CREATE PROCEDURE letsgo (IN id int) BEGIN 
DECLARE nR INT; 
DROP TEMPORARY TABLE IF EXISTS children; 
CREATE TEMPORARY TABLE children AS (SELECT id as Id); 
DROP TEMPORARY TABLE IF EXISTS children_prev; 
CREATE TEMPORARY TABLE children_prev AS (SELECT id as Id); 
SET nR = (SELECT count(*) FROM children); 
WHILE (nR > 0) DO 
    DROP TEMPORARY TABLE IF EXISTS children_aux; 
    CREATE TEMPORARY TABLE children_aux AS (
    SELECT memberID as id 
     FROM Members_relations R 
     INNER JOIN children_prev C on C.id = R.parentID 
    ); 
    SET nR = (SELECT count(*) FROM children_aux); 
    INSERT INTO children 
     SELECT * FROM children_aux; 
    TRUNCATE TABLE children_prev; 
    INSERT INTO children_prev 
     SELECT * FROM children_aux; 
END WHILE; 
SELECT SUM(Sale) 
    FROM Members_sales S 
    INNER JOIN children C on C.id = S.Id; 

END; 
$$ 
DELIMITER ; 

Тестирование:

mysql> call letsgo(1); 
+-------------+ 
| SUM(Sale) | 
+-------------+ 
|  1350 | 
+-------------+ 
1 row in set (0.16 sec) 

mysql> call letsgo(100); 
+-------------+ 
| SUM(Sale) | 
+-------------+ 
|   888 | 
+-------------+ 
1 row in set (0.06 sec) 

Примечание: мои извинения от грязного раствора, но это MySQL : нет CTE, нет выбора по рекурсии по функциям, нет DO-WHILE, ...

Примечание: помните, что многоплановые маркетинговые планы не допускаются этически и запрещены законом во многих странах.

Смежные вопросы