说我有一个像下面这样的MySQL表。从底部开始,我想找到一个拥有"状态= 1"的赞助商。但我想按顺序做。对于例如我是" Mike"。我的赞助商是#34; Richard"。我想查一下" Richard"状态为1.他没有。所以现在我要检查理查德"的赞助商,看看他的状态是否为1。他也没有。所以我继续上去,检查我的赞助商赞助商的赞助商等等。
如果我想检查几个级别,通常我可以使用一个或多个查询来执行此操作。但问题出现了,如果我想检查无限级别,直到找到赞助商的状态为1?怎么样?什么是php查询/函数看起来像检查无限级别?
Sponsors Referrals Status
--------------------------------------
Zack Joey 1
Joey Tracy 0
Tracy Helen 0
Helen Richard 0
Richard Mike 0

答案 0 :(得分:0)
根据我的理解,您希望所有赞助商的状态为1,顺序为
SELECT * FROM `table`
where status = 1
ORDER BY id DESC
试一试。
答案 1 :(得分:0)
在我看来,在php中执行此操作是错误的方法,因为它会导致从应用程序到数据库的N个请求(其中N是必须处理的级别,直到找到具有所需状态的发起人)。有人可能会对此进行优化,但基本问题将始终如一。
数据基本上代表树形结构(如果赞助商总是只能引用一个人,则列表)。
在关系数据库中有表示树的模式,但它需要更改数据库结构(Nested set只是一个例子)。 Bill Karwin has a nice slidedeck on the topic
如果您不限于MySQL或可以等到MySQL 8.0发布,那么使用CTE/Recursive queries也是一种选择。
在任何情况下,最好的部分是,一旦你有树结构,你不仅仅局限于一个用例。
Appendum
php不是我选择的编程语言,所以我不能特别推荐一个库。但似乎有几个库可供选择:答案 2 :(得分:0)
虽然解决方案似乎肯定是像Lawrence所建议的那样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