说我有一个mysql表,如下所示。从底部开始,我想找到一个具有"状态= 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击打赞助商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
demo
根据我的理解,您希望所有具有反向顺序的状态1的赞助商
SELECT * FROM `table`
where status = 1
ORDER BY id DESC
尝试一下。
在我看来,在PHP中这样做是错误的方法找到所需的状态)。一个人可能可以优化这一点,但基本问题总是相同的。
数据基本上表示树结构(如果保证人总是只能引用一个人)。
有一些模式用于表示关系DB中的树,但需要更改DB结构(嵌套集只是一个例子)。比尔·卡尔文(Bill Karwin)对这个话题有一个不错的滑动。
如果您不限于MySQL或可以等到MySQL 8.0发布,则使用CTE/递归查询也是一个选项。
在任何情况下,好部分是,一旦您拥有树结构,您就不仅限于一个用例。
附录
PHP不是我选择的编程语言,因此我不能特别推荐一个库。但是似乎有几个库可供选择:
- https://github.com/ben-nsng/nestedset-php
- https://github.com/riquito/baobab