将代码从while循环更改为array_shift

问题描述 投票:0回答:1

我有一个包含类别和子类别的数据库,我想找到子类别的原始父类。例如,如果我有C1-> C2-> C3-> C4,其中C1是原始父级,我想找到C1的id,知道C4的id。我已成功使用带有while循环的if语句找到它,但我被告知将其更改为array_shift(),因为当有大量数据通过时,while会非常慢。问题是我无法弄清楚如何将代码从while更改为array_shift,甚至不知道从哪里开始。这就是我现在所拥有的:

        $sql = "SELECT `parent_id` FROM c_assoc WHERE c_id = $cToPutInto";
        $result = $conn -> query($sql);

        if($result -> num_rows > 0) {
            $parent = $result -> fetch_assoc()['parent_id'];
            $sql = "SELECT `parent_id` FROM c_assoc WHERE c_id = $parent";
            $result = $conn -> query($sql);
            while ($result -> num_rows > 0) {
                $parent = $result -> fetch_assoc()['parent_id'];
                $sql = "SELECT `parent_id` FROM c_assoc WHERE c_id = $parent";
                $result = $conn -> query($sql);
            }
        } 
php
1个回答
0
投票

这是一个可以尝试的简单示例:

假设你有一个类别的表类别:

   "id"|"parent_id"|"name"
    "1" |   NULL    | "PHP"
    "2" |   "1"     |"Symfony"
    "3" |   "1"     |"Laravel"
    "4" |   NULL    |"JAVA"
    "5" |   "4"     |"Spring"
    "6" |   "4"     |"JEE"
    "7" |   "2"     |"Command"
    "8" |   "2"     |"Request"

根父类别的parent_id等于null,因此您可以使用简单查询来选择根父级而不进行while循环,如:

select * from (select name, id, @parent:=parent_id as parent from 
(select @parent:=8 ) a join (select * from categorie order by id desc) b
 where @parent=id) as res WHERE res.parent IS NULL

在你的罐子里,你可以注入你想要的类别的id(在我的例子中,我使用8值)

结果返回:

|id|name|parent|
|  |    |      |
|1 |PHP | NULL |

希望对你有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.