找到一个用户的赞助商无限提升PHP?



说我有一个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

最新更新