Найти свободно реферала

222
08 сентября 2018, 18:00

есть структура как в таблице на картинке

у каждого пользователя есть свои уровни рефералов как на фото 2

Как мне найти пользователя(реферала, у которого нет дочки) например в ветке, которая начинается с id 3? пока я додумался как найти свободного реферала у которого нет дочки по все структуре:

SELECT min(t1.id) as refer, t1.parent_id, t1.user_id as us_id, t2.cnt
                        FROM modxev_programm_one as t1
                        LEFT JOIN 
                        (
                        SELECT parent_id, COUNT(parent_id) as cnt 
                        FROM modxev_programm_one
                        WHERE parent_id is not null
                        GROUP BY parent_id 
                        ) as t2
                        ON t1.id = t2.parent_id
                        WHERE t2.cnt > 0 and t2.cnt < 2

как сделать, чтобы поиск начинался от конкретного парента, например id=3? без рекурсии и процедруы, так как хостинг этого не дает сделать, нужен vps хостинг

Answer 1

написал вот такой алгоритм, выводит дерево для пользователя

<?php
$sql= "SELECT id, parent_id, user_id FROM modxev_programm_one";
$cats = array();
$statement = $modx->query($sql);
$parent = $statement->fetchAll(PDO::FETCH_ASSOC);
foreach ($parent as $res) {
    $cats[$res['parent_id']][] =  $res;
}
function build_tree($cats,$parent_id){
if(is_array($cats) and count($cats[$parent_id])>0){
$tree = '<ul>';
 foreach($cats[$parent_id] as $cat){
  $tree .= '<li>'.$cat['user_id'];
 $tree .=  build_tree($cats,$cat['id']);
  $tree .= '</li>';         
 }
 $tree .= '</ul>';
  } 
  else return null;          
  return $tree; 
}
echo build_tree($cats,2);

а как теперь посчитать и вычислить у кого нет дочек либо одна?

Answer 2

Для того, чтобы найти к-во рефералов у конкретного id:

SELECT id, (SELECT count (*) FROM modxev_programm_one t2 WHERE t2.parent_id=t1.id) AS cnt
FROM modxev_programm_one t1
WHERE id=3

Чтобы найти все id, у которых менее 2х рефералов:

SELECT id, cnt from (
SELECT id, (SELECT count (*) FROM modxev_programm_one t2 WHERE t2.parent_id=t1.id) AS cnt
FROM modxev_programm_one t1) x
WHERE x.cnt<2
READ ALSO
Хранение и удаление значений из массива

Хранение и удаление значений из массива

Есть массив ID товаровПользователь может выбрать 1 товар много раз

166
Парсинг отзывов из Яндекс Карты и Google Place

Парсинг отзывов из Яндекс Карты и Google Place

Хочу решить задачу с копированием отзывов в мой WP сайт из google place или яндекс картыно там по умолчанию выводится 10 отзывов

199
try catch начал ловить E_WARNING

try catch начал ловить E_WARNING

Недавно обнаружил, что в проекте конструкции вида:

187
Как получить разделение на категории?

Как получить разделение на категории?

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

164