将代码从while循环更改为array_shift

时间:2019-03-28 11:16:04

标签: php

我有一个包含类别和子类别的数据库,我想找到子类别的原始父项。例如,如果我有C1-> C2-> C3-> C4,其中C1是原始父对象,我想知道C4的ID来找到C1的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);
            }
        } 

1 个答案:

答案 0 :(得分: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 |

希望对您有帮助。