我有一个包含类别和子类别的数据库,我想找到子类别的原始父项。例如,如果我有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);
}
}
答案 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 |
希望对您有帮助。