如何知道/检查请求的页面是数据库中的子行还是子行?

时间:2011-09-20 15:48:50

标签: php mysql sql

我如何知道/检查请求的页面/行是子行还是子子行?

例如,这是我的页面表,

pg_id   pg_url  pg_title    parent_id
1       a       a           1
2       b       b           2
3       aa      aa          1
4       aaa     aaa         3

pg_id 3页面,其父级为pg_id 1,而pg_id 4子级页面,因为其parent是pg_id 3

以下是我查询通常如何获取信息的信息,

SELECT 
p.pg_id, 
p.pg_url,
p.parent_id

FROM root_pages AS p
WHERE p.pg_id = '4'

但它没有提供所请求的是子页面还是子页面的信息。

是通过查询实现此目的的任何方法吗?

4 个答案:

答案 0 :(得分:0)

我想你会想要这样的东西:

SELECT 
p.pg_id, 
p.pg_url,
p.parent_id,
p2.pg_id as 'ParentPageID',
p3.pg_id as 'GrandparentPageID'

FROM root_pages AS p
LEFT JOIN root_pages AS p2 on p.parent_id = p2.pg_id AND p.pg_id <> p2.pg_id
LEFT JOIN root_pages AS p3 on p2.parent_id = p3.pg_id AND p2.pg_id <> p3.pg_id
WHERE p.pg_id = '4'

如果祖父母页面ID不为空,则它是子子页面。如果是,但父页面ID不为空,则为子页面。

答案 1 :(得分:0)

SELECT IF(p.pg_id == p.parent_id,'true','false') AS 'top_level',
IF(sub_page.pg_id IS NOT NULL,'true','false') AS 'sub_level',
IF(sub_sub_page.pg_id IS NOT NULL,'true','false') AS 'sub_sub_level',
p.pg_id, 
p.pg_url,
p.parent_id
FROM root_pages AS p
LEFT JOIN p AS sub_page ON sub_page.pg_id = p.parent_id AND p.parent_id != p.parent_id 
LEFT JOIN p AS sub_sub_page ON sub__sub_page.pg_id = sub_page.parent_id AND sub_page.parent_id != sub_page.parent_id 
WHERE p.pg_id = '4'

应该可以正常工作

答案 2 :(得分:0)

如果我正确理解你的问题,那么如果给定行的parent_id = pg_id,那么该行就是其自身的父级,而不是“子页面”或“子子页面”。

如果您要查找页面所在的确切级别,则需要使用递归或递归查询。下面只是在PHP中执行递归,但使用递归查询会更有效。

   function findLevel($root, $current, $level) {
       if($root == $current) return $level;
       $parent = mysql_fetch_array($db->query(
           'SELECT parent_id FROM page WHERE pg_id = ?', 
           array( $current )));
       return findLevel($root, $parent['parent_id'], $level+1);      
   }

   $pageLevel = findLevel(1, 4, 0);  // Finds the the level for the id '4'

答案 3 :(得分:0)

试试这个:

SELECT 
    p.pg_id, 
    p.pg_url,
    p.parent_id,
    IF(
         p.parent_id =1,
        'sub page',
        'sub sub page'
    ) as page_type
    r.parent_id as root page    
FROM root_pages AS p
LEFT JOIN root_pages AS r
    ON r.pg_id = p.parent_id
WHERE p.pg_id = '4'

但这是一个静态的例子,我的意思是它适用于2种情况:子页面和子子页面,但对于n种情况,你需要一个不同的方法