2014-06-13 18 views
1

我有一个表,其中父页和子页,其中首页是parent_id = 0和子页parent_id是其他页的ID。MySQL select父母和孩子全部来自表

ID 1 | parent_id 0 
ID 2 | parent_id 0 
ID 3 | Parent_id 1 
ID 4 | parent_id 1 
ID 5 | parent_id 0 

所以我

SELECT * 
FROM pages AS parent 
WHERE parent.parent_id = 0 

SELECT * 
FROM pages AS sub 
WHERE sub.parent_id != 0 

以上单独的查询工作。但我相信有一个可能列出所有页面与一个查询。

我试图得到类似这样的列表,分组子页面的父页面

Main (Title1) 
Main (Title2) 
    SUB (Title1) 
    SUB (Tible2) 
Main (Title3) 
etc 

我一直想我的运气与内部联接和左加入,但我解决不了这个。

我希望有一些有经验的善良的灵魂会给我一只手。 :)

谢谢

+0

我建议在看SQL的GROUPBY功能。如果你列出了你试过的一些东西(实际的代码),那么有人可以为你调整。 – Robert

+0

'select * from yourtable'将列出所有内容。如果你想要树形结构,这取决于你。 SQL不会做“树”。它会执行一组数据。 –

+0

当您在所需输出中的“SUB”之前有缩进...这代表什么?这是否意味着你想以某种方式格式化mySQL结果?因为这不可能发生。这是否意味着你想按照你想要的输出顺序排列结果?因为这是可行的,但是它需要SQL中的一些疯狂的诡计来吸引人。你会更好地把所有东西都拿出来,并用PHP来完成工作。 –

回答

0

尝试以下查询,它具有额外的列page_type指示页面类型。

SELECT page.* , IF( (SELECT p.parent_id FROM pages p WHERE p.id = page.id) = 0, "PARENT", "CHILD" ) AS PAGE_TYPE FROM pages AS page

+0

嗨。感谢您分享您的知识。这就是我所问的。有没有办法,因为子记录是在父记录之后出现的?将他们缩短为父亲>儿子|父亲| etc – user2958509

+0

order by parent_id可用于对记录进行排序,以便子记录出现在父记录之后。 '从page.parent_id asc页面按页面排序' –

+0

嗨。我的意思是,我可以先得到父母,然后是孩子,然后是另一个父母,如果孩子存在,那么父母等等,直到列表完成为止。 – user2958509

0

您可以使用空校验和LEFT JOIN本身:

SELECT IF(parent.ID IS NULL, 'MAIN', 'SUB') as grouping, page.*, parent.* 
FROM pages as page 
LEFT JOIN pages as parent 
ON page.parent_id = parent.ID