我如何知道/检查请求的页面/行是子行还是子子行?
例如,这是我的页面表,
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'
但它没有提供所请求的是子页面还是子页面的信息。
是通过查询实现此目的的任何方法吗?
答案 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种情况,你需要一个不同的方法