【问题标题】:Get The Topmost Parent's ID, Regardless of The Child's ID获取最顶层的父母 ID,而不考虑孩子的 ID
【发布时间】:2012-09-03 00:58:29
【问题描述】:

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

http://jsfiddle.net/Fuqrb/

我想通过使用孩子的 id 找到最顶层的父母 id。例如,我们得到一个 URL 变量作为最底层孩子的 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 变量作为更高/更低级别的另一个孩子的 id,这将不起作用。

如何动态获取最顶层父母的id,而不考虑孩子的id?

【问题讨论】:

  • 如果你还没有使用正确的nested set
  • 问题是我已经将太多数据上传到表中。我还对所有页面进行了编码,以根据父母的 id 获取数据
  • 谢谢,我已经读过了,但我不明白如何实现他的方法来获取最顶层的父母的id
  • 嗯,主要的一点是,使用常规相邻列表来实现这一点确实很困难,但使用嵌套集合就很简单了。请参阅stackoverflow.com/questions/3623645/… 了解如何在事后使其成为嵌套集。

标签: php mysql loops mysqli parent-child


【解决方案1】:
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);

【讨论】:

  • 对不起,我只知道基本的MySQL。如何在 PHP 中实现上述 SQL 命令?关于“SELECT fnGetRootParent(213)”这一行,213 是给定的 URL 变量 p,对吧?
  • 213 是参数。您可以在 PHPMyAdmin 中执行第一条 SQL。你只需要这样做一次,然后它就被注册为一个函数并且可以像我的例子一样被调用。
  • 它返回错误信息:“无法保存结果集”和“表 'my_database.p' 不存在”。为什么会这样?表名是“page”,URL是“website.com/page.php?p=6”
  • 好的,我用 PHPMyAdmin 运行了第一部分,然后用 PHP 文件 (page.php) 运行了第二部分。网络浏览器一直显示加载指示器(没有结果也没有错误消息),我的 CPU 温度升高到 80 摄氏度,并一直升高,直到我关闭 WAMP 服务器。为什么会这样?
  • 可能是因为您遇到了无限循环。 “顶级父母”的“父母”列中的值是多少?
猜你喜欢
  • 1970-01-01
  • 2022-11-24
  • 2016-03-13
  • 1970-01-01
  • 2020-08-11
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
相关资源
最近更新 更多