我有一个包含类别和子类别的数据库,我想找到子类别的原始父类。例如,如果我有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);
}
}
这是一个可以尝试的简单示例:
假设你有一个类别的表类别:
"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 |
希望对你有所帮助。