php - 获取最高父级的 ID,而不 pipe 级的 ID

标签 php mysql loops mysqli parent-child

我有一个表(例如名称是“page”),其中每一行都是另一行的子行,如下所示(请参阅 HTML 部分):

http://jsfiddle.net/Fuqrb/

我想通过使用 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/

相关文章:

c++ - 错误 : Range-based 'for' loops are not allowed in C++98 mode

php - 使用 php 匹配两个变量的内容

php - 将请求的ID发送到PHP

asp.net - 使用 ASP.net 在 MySql 中存储当前日期和时间

VBA-Loop 和一些工作表

loops - 如何使用 Terraform 将多个服务器添加到 Hetzner Cloud 中的 LoadBalancer?

PHP将用户数组插入用户数组并循环用户和用户数据(属性)

php - 查找给定一天的当前月份的第一秒时间戳

php - 单击动态创建的复选框时通过 AJAX/PHP 更新 MySQL 中的值?

mysql - 合并多对多结果