2012-09-10 76 views
1

我有一个表(例如名称是“页面”),其中每行是另一行的孩子,如下所示(请参阅HTML部分):获取顶端父母的ID,不管孩子的ID

http://jsfiddle.net/Fuqrb/

我想通过使用一个孩子的ID找到最顶层父母的ID。例如,我们得到了一个URL变量作为最底层的孩子ID:

http://www.website.com/page.php?p=6 

然后,我们的网址变量存储到一个变量:

$p = $_GET['p']; 

为了得到最顶层的一方的身份证,我不得不多次使用查询功能。例如:

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?

+0

使用适当[嵌套组(http://en.wikipedia.org/wiki/MPTT)如果您还不是。 – deceze

+0

问题是我已经把太多的数据上传到表中了。此外,我已编码所有页面获取基于父母的ID – Bayu

+1

的数据好吧,阅读此:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ – deceze

回答

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);

+0

对不起,我只知道基本的MySQL。如何在PHP中实现上面的SQL命令?关于“SELECT fnGetRootParent(213)”一行,213是给定的URL变量p,对不对? – Bayu

+0

213是参数。您可以在PHPMyAdmin中执行第一部分SQL。你只需要做一次,然后它被注册为一个函数,并且可以像我的例子那样调用。 – Sherlock

+0

它返回错误消息:“无法保存结果集”和“表'my_database.p'不存在”。为什么发生这种情况?表名是“page”,URL是“website.com/page.php?p=6” – Bayu