Здесь образец решения. Я изменил структуру дерева, чтобы иметь больше смысла отвечать. Быть свободным, чтобы соответствовать коду с точными требованиями (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, ...
Примечание: помните, что многоплановые маркетинговые планы не допускаются этически и запрещены законом во многих странах.
Можете ли вы показать, как будет выглядеть ваш желаемый конечный результат? – Sean
, например, член 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)) –
Не слишком любите свои запятые в своих первых блоках. На самом деле у вас нет идентификатора, хранящегося в виде разделенных запятыми списков? Также не должен быть член только 1 родитель? – Drew