Скажем, у меня есть таблица 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
Хотя решение определенно заключается в том, чтобы 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
Насколько я понимаю, вы хотите, чтобы все спонсоры имели статус 1 в обратном порядке.
SELECT * FROM `table`
where status = 1
ORDER BY id DESC
Дайте это попробовать.
Делать это в php, на мой взгляд, неправильный подход, так как это приведет к N запросам от приложения к базе данных (где N — уровни, которые должны обрабатываться, пока не будет найден спонсор с желаемым статусом). Можно было бы оптимизировать это, но основная проблема всегда будет одинаковой.
Данные в основном представляют древовидную структуру (или список, если спонсор всегда может ссылаться только на одного человека).
Существуют шаблоны для представления деревьев в реляционной БД, но это потребует изменений в структуре БД (Вложенный набор это всего лишь один пример для этого). У Билла Карвина есть хорошая слайд-колода на тему.
Если вы не ограничены MySQL или можете дождаться выпуска MySQL 8.0, используйте CTE / Рекурсивные запросы также будет вариант.
Хорошей частью в любом случае является то, что вы не ограничены только одним вариантом использования, если у вас есть древовидная структура.
Appendum
php не мой язык программирования, поэтому я не могу порекомендовать одну библиотеку. Но есть несколько библиотек на выбор: