как получить общее количество команд для одноуровневого mlm-дерева

#mysql #tree #treeview #mlm

#mysql #дерево #просмотр дерева #mlm

Вопрос:

Мне нужно найти общее количество команд для одноуровневого дерева mlm, у меня есть таблица пользователей следующим образом

  ------- ------- ----------- 
| id    | fname | parent_id |
 ======= ======= =========== 
| sk001 | aa    | null      |
 ------- ------- ----------- 
| sk002 | ss    | ssk001    |
 ------- ------- ----------- 
| sk003 | dd    | sk001     |
 ------- ------- ----------- 
| sk004 | ff    | sk002     |
 ------- ------- ----------- 
| sk005 | gg    | sk002     |
 ------- ------- ----------- 
| sk006 | hh    | sk005     |
 ------- ------- ----------- 
| sk007 | jj    | sk006     |
 ------- ------- ----------- 
| sk008 | kk    | sk006     |
 ------- ------- ----------- 
| sk009 | ll    | sk004     |
 ------- ------- ----------- 
| sk010 | mm    | sk005     |
 ------- ------- ----------- 
  

и у меня есть таблица invoice_order, подобная этой

  ------- ------- ----------- -------- 
| id    | fname | parent_id | amount |
 ======= ======= =========== ======== 
| sk001 | aa    | null      | 100    |
 ------- ------- ----------- -------- 
| sk002 | ss    | ssk001    | 400    |
 ------- ------- ----------- -------- 
| sk002 | dd    | sk001     | 225    |
 ------- ------- ----------- -------- 
| sk004 | ff    | sk002     | 50     |
 ------- ------- ----------- -------- 
| sk005 | gg    | sk002     | 59     |
 ------- ------- ----------- -------- 
| sk006 | hh    | sk005     | 77     |
 ------- ------- ----------- -------- 
| sk007 | jj    | sk006     | 89     |
 ------- ------- ----------- -------- 
| sk004 | ff    | sk002     | 87     |
 ------- ------- ----------- -------- 
| sk009 | ll    | sk004     | 45     |
 ------- ------- ----------- -------- 
| sk010 | mm    | sk005     | 56     |
 ------- ------- ----------- -------- 
  

Здесь я должен рассчитать личное общее количество и общее количество идентификаторов команды,
пример (дерево):

              sk001 
                |
                |--sk002
                |     |--sk004
                |     |    |--sk009
                |     |    |--xy
                |     |
                |     |--sk005
                |
                |--sk003  
  

например: общее количество команд sk002 должно содержать общую сумму покупок отдельного человека в команде (sk004,sk009,xy)

Я только что попробовал что-то вроде этого :

 SELECT  (SUM(amount))/2 as indteamtotal 
                                          from    (SELECT * from invoice_order
                                                   order by id, parent_id) products_sorted,
                                                  (SELECT @pv := 'sk002') initialisation
                                          where   find_in_set(parent_id, @pv) > 0
                                          and     length(@pv := concat(@pv, ',', id)) order by parent_id asc
  

но я не получаю правильное общее количество команд
Есть ли какие-либо возможности для использования процедуры mysql

Комментарии:

1. Почему это помечено php ? В вашем вопросе нет PHP.

Ответ №1:

Вы можете использовать CTE, если у вас есть MySQL 8

 with recursive tree as (
 select id from invoice_order where id = 'sk002'
 union
 select i.id from invoice_order i join tree on tree.id = i.parent_id
)  
select sum(amount) from invoice_order where id in (select id from tree);
  

Ссылка на скрипку

Комментарии:

1. что я могу сделать для mysql 5 @MBeale