1

以下のように、各行が別の行の子であるテーブル(たとえば、名前は「ページ」)があります(HTMLセクションを参照)。

http://jsfiddle.net/Fuqrb/

子のIDを使用して、最上位の親のIDを見つけたい。たとえば、一番下の子のIDとしてURL変数を取得します。

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"];
    }
}

上位/下位レベルの別の子のIDとして別のURL変数を取得した場合、これは機能しないため、この方法は効果的ではありません。

子のIDに関係なく、最上位の親のIDを動的に取得するにはどうすればよいですか?

4

1 に答える 1

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

于 2012-09-10T07:30:13.863 に答える