mysql — Найти спонсора пользователя, идущего на бесконечные уровни в PHP?

Скажем, у меня есть таблица MySQL, как показано ниже. Идя снизу, я хочу найти спонсора, который имеет «Status = 1». Но я хочу сделать это по порядку. Например, Я «Майк». Мой спонсор «Ричард». Я хочу проверить, имеет ли «Ричард» статус 1. Он не имеет. Так что теперь я собираюсь проверить спонсора «Ричарда», чтобы увидеть, имеет ли он статус 1. Он также не имеет. Поэтому я продолжаю подниматься, проверяю спонсора спонсора моего спонсора … и т. Д.

Обычно я могу сделать это с помощью одного или нескольких запросов, если я хочу проверить несколько уровней. Но проблема возникает, если я хочу проверить бесконечные уровни до тех пор, пока он не найдет спонсора, чей статус равен 1? Как это работает? Как бы выглядел php-запрос / функция для проверки бесконечных уровней?

    Sponsors     Referrals      Status
--------------------------------------
Zack         Joey             1
Joey         Tracy            0
Tracy        Helen            0
Helen        Richard          0
Richard      Mike             0

1

Решение

Хотя решение определенно заключается в том, чтобы parent_id как предполагает Лоуренс, я хотел бы дать PHP-решение для этого, предполагая, что у вас уже есть список людей в массиве (то есть, не один запрос на пару, поскольку это было бы действительно расточительно).

Что вам нужно сделать, так это рекурсивно перебирать массив, переходя от спонсора к спонсору, пока вы не достигнете спонсора со статусом 1. Посмотрите на эту функцию:

<?php
$people = [
[
"sponsor" => "Zack",
"referal" => "Joey",
"status" => 1,
],
[
"sponsor" => "Joey",
"referal" => "Tracy",
"status" => 0,
],
[
"sponsor" => "Tracy",
"referal" => "Helen",
"status" => 0,
],
[
"sponsor" => "Helen",
"referal" => "Richard",
"status" => 0,
],
[
"sponsor" => "Felipe",
"referal" => "Juan",
"status" => 0,
],
[
"sponsor" => "Richard",
"referal" => "Mike",
"status" => 0,
],
];
static $i = 0;
function getParentSponsor($referal, $people) {
foreach ($people as $pair) {
if ($pair["referal"] === $referal) {
if ($pair["status"] === 1) { // we found our parent sponsor
return $pair["sponsor"];
}
else {
return getParentSponsor($pair["sponsor"], $people); // we need to go to the next element
}
return $pair["sponsor"];
}
}
$i++;
}
echo getParentSponsor("Mike", array_reverse($people)).PHP_EOL; // Zack
echo getParentSponsor("Richard", array_reverse($people)).PHP_EOL; // Zack
echo getParentSponsor("Joey", array_reverse($people)).PHP_EOL; // Zack

демонстрация

0

Другие решения

Насколько я понимаю, вы хотите, чтобы все спонсоры имели статус 1 в обратном порядке.

SELECT * FROM `table`
where status = 1
ORDER BY id DESC

Дайте это попробовать.

0

Делать это в php, на мой взгляд, неправильный подход, так как это приведет к N запросам от приложения к базе данных (где N — уровни, которые должны обрабатываться, пока не будет найден спонсор с желаемым статусом). Можно было бы оптимизировать это, но основная проблема всегда будет одинаковой.

Данные в основном представляют древовидную структуру (или список, если спонсор всегда может ссылаться только на одного человека).

Существуют шаблоны для представления деревьев в реляционной БД, но это потребует изменений в структуре БД (Вложенный набор это всего лишь один пример для этого). У Билла Карвина есть хорошая слайд-колода на тему.

Если вы не ограничены MySQL или можете дождаться выпуска MySQL 8.0, используйте CTE / Рекурсивные запросы также будет вариант.

Хорошей частью в любом случае является то, что вы не ограничены только одним вариантом использования, если у вас есть древовидная структура.

Appendum

php не мой язык программирования, поэтому я не могу порекомендовать одну библиотеку. Но есть несколько библиотек на выбор:

0
По вопросам рекламы [email protected]