我有一个表(例如名称是“page”),其中每一行都是另一行的子行,如下所示(请参阅 HTML 部分):
我想通过使用 child 的 ID 找到最顶层的 parent ID。例如,我们得到一个 URL 变量作为最底层 child 的 id:
http://www.website.com/page.php?p=6
然后我们将 URL 变量存储到一个变量中:
$p = $_GET['p'];
要获得最高父级的 id,我必须多次使用查询函数。例如:
if($result = $mysqli->query("SELECT * FROM page WHERE id='$p' LIMIT 1"))
{
while($row = $result->fetch_array())
{
$parent = $row["parent"];
}
}
if($result = $mysqli->query("SELECT * FROM page WHERE id='$parent' LIMIT 1"))
{
while($row = $result->fetch_array())
{
$parent1 = $row["parent"];
}
}
if($result = $mysqli->query("SELECT * FROM page WHERE id='$parent1' LIMIT 1"))
{
while($row = $result->fetch_array())
{
$parent2 = $row["parent"];
}
}
if($result = $mysqli->query("SELECT * FROM page WHERE id='$parent2' LIMIT 1"))
{
while($row = $result->fetch_array())
{
$id = $row["id"];
}
}
这种方式是无效的,因为如果我得到另一个 URL 变量作为更高/更低级别的另一个 child 的 id,这将不起作用。
如何动态获取最顶层父级的id,而不考虑子级的id?
最佳答案
DELIMITER $$
CREATE FUNCTION `fnGetRootParent`(
page INT
) RETURNS int(11)
READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE _parent INT;
DECLARE _result INT;
SET _parent = page;
my_loop: LOOP
SELECT
p.id
,p.parent
INTO
_result
,_parent
FROM page p
WHERE id = _parent;
IF (_parent = 0) OR (_parent = _result) THEN
LEAVE my_loop;
END IF;
END LOOP my_loop;
RETURN _result;
END
SELECT fnGetRootParent(213);
关于php - 获取最高父级的 ID,而不 pipe 级的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12346961/