【问题标题】:PHP/MYSQL - Counting and comparing entries in a myqsl table with phpPHP/MYSQL - 使用 php 计算和比较 mysql 表中的条目
【发布时间】:2021-10-11 00:04:11
【问题描述】:

我想知道是否有人可以帮助我/指出正确的方向。

我有一个数据库,其中包含一个包含增量 id、名称、唯一 id 和虚构角色的父 uuid 的表。

表格显示以下人员...

John (Parent not listed)
Steve (Parent listed as John)
Mark (Parent listed as John)
Kevin (Parent listed as Steve)
Adam (Parent listed as Mark)

**ID, NAME, UUID, PARENT_UUID**
1, John, 0001, none
2, Steve, 0002, 0001
3, Mark, 0003, 0001
4, Kevin, 0004, 0002
5, Adam, 0005, 0003

所以在这个例子中,约翰有 2 个儿子,史蒂夫和马克......他们每个人都有一个儿子,凯文和亚当。

我想做的是(在已创建的个人资料页面上)显示家庭成员的数量。

所以转到 Johns 页面,我会看到“John (4 Descendents)”,如果我转到 Marks 页面,我会看到“Mark (1 Descendents)”

请允许我列出在表中找到的低代家庭成员的数量。

我可以打印所有家庭成员的列表...使用:

        $sql = "SELECT * FROM users";
        $result = $conn->query($sql);
        if ($result->num_rows > 0) {
            while($row = $result->fetch_assoc()) {
                echo $row["uuid"]. "<br>";
            }
        }

但现在我想找出每个 $row['uuid'] 每个条目有多少后代。

我尝试执行以下操作:

        $sql = "SELECT * FROM users";
        $result = $conn->query($sql);
        if ($result->num_rows > 0) {
            while($row = $result->fetch_assoc()) {
                $sql = "SELECT * FROM users WHERE parent_uuid = '".$row['uuid']."'";
                $result = $conn->query($sql);
                if ($result->num_rows > 0) {
                   $numOfDescendents = $result->num_rows;
                }
            }
        }

但后来我意识到这不仅行不通(它会抓取第一行的编号并停止),使用这个逻辑,如果我有一个有 20 多代人的家庭,我将需要有20 多个 while 循环相互嵌套,检查每一代。

所以我想知道,这甚至可能吗?

可能有一个简单的方法,但经过 3/4 天的头痛和沮丧后,我终于寻求帮助 =)

我的最终目标是创建一个 php 文件,用于检查所有用户的表,并通过计算表中有多少人使用他们的 uuid 作为 parent_uuid 来计算他们的后代...如开头的示例所示。 .. John 有 4 个,Mark 有 1 个,Steve 有 1 个,Kevin 有 0 个,Adam 有 0 个。

提前感谢您的任何指导 =)

【问题讨论】:

    标签: php mysql arrays recursion while-loop


    【解决方案1】:

    您可以使用递归函数来解决这个问题。注意 - 我将整个输入传递给我不推荐的递归数组。如果您使用的是类,请将输入设置为类的属性,或者您可以使用全局,但也不推荐。

    $input = [
        ['id' => 1, 'name' => 'John', 'UUID' => 0001, 'PARENT_UUID' => null],
        ['id' => 2, 'name' => 'Steve', 'UUID' => 0002, 'PARENT_UUID' => 0001],
        ['id' => 3, 'name' => 'Mark', 'UUID' => 0003, 'PARENT_UUID' => 0001],
        ['id' => 4, 'name' => 'Kevin', 'UUID' => 0004, 'PARENT_UUID' => 0002],
        ['id' => 5, 'name' => 'Adam', 'UUID' => 0005, 'PARENT_UUID' => 0003],
      ];
    
    function getDescendents($uuid, $input, $count = 0, $descendants = [])
    {  
        foreach ($input as $user) {
            if ($user['PARENT_UUID'] === $uuid) {
                $count++;
                $descendants[] = $user['UUID'];
            }
        }
    
        if (!empty($descendants)) {
            $new_uuid = array_shift($descendants);
            return getDescendents($new_uuid, $input, $count, $descendants);
        }
        return $count;
    }
    
    $result = [];
    foreach ($input as $user) {
       $result[$user['name']] = getDescendents($user['UUID'], $input);
    }
    
    echo(json_encode($result));
    

    输出 -

    {"John":4,"Steve":1,"Mark":1,"Kevin":0,"Adam":0}
    

    上述对象中的key是用户名,value是后代的数量。

    【讨论】:

    • 感谢您抽出宝贵时间回答思比!我将尝试看看是否可以实施您的解决方案。就输入而言...仅通过搜索 UUID 会起作用吗?因为我希望通过调用所有 uuid 来为表中的所有人执行此操作……例如像这样的事情……$sql = "SELECT uuid FROM users"; $result = $conn-&gt;query($sql); if ($result-&gt;num_rows &gt; 0) { while($row = $result-&gt;fetch_assoc()) { $input = [ $row['uuid'] ]; } } 虽然我确定 id 必须用一组 uuid 填充输入?
    • 您需要从数据库中获取至少 UUID 和 PARENT_UUID
    • 谢谢! =) 我会看看我是否可以计算出如何调用所有 uuid 和 parent_uuid 并将它们传递给输入。非常感谢您的帮助! :thumbup:
    • 我刚刚意识到这个解决方案可能对我不起作用,因为输入需要匹配的 UUID 和 PARENT_UUID。如果我理解正确,这意味着我必须将 UUID 和 PARENT_UUID 的每个组合传递给输入,这可能会导致数百万。也许我对这个任务不够了解,但我正在制作的应用程序依赖于能够计算用户家族树中有多少用户。
    • 您也可以使用 CTE 在数据库级别执行此操作,但这也是一个昂贵的过程。你可以在这里阅读更多相关信息 - mysql cte
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多