使用相同表选择可选父行

时间:2013-03-21 04:28:10

标签: mysql sql pdo

我正在尝试从表格中选择所有行,并在同一行中包含有关其父级的一些信息如果他们有父级,否则父级数据应为空白。

SELECT
p.id,
p.name,
'0' AS page_exists      
FROM 
pages p
    LEFT JOIN pages pp ON (pp.page_id=p.parent) 
WHERE 
p.page_type=3 
ORDER BY 
name ASC

我希望父级成功匹配,将以下两列添加到每一行: “parent_id”和“parent_name”

包含父级的网页的最终结果如下所示:

id=2
name="test"
page_exists=0   
parent_id=1
parent_name="abc"

如果某个网页没有父网页,则应该如下所示:

id=3
name="other page"
page_exists=0   
parent_id=0
parent_name=""

1 个答案:

答案 0 :(得分:0)

当您对表格LEFT JOIN执行自己的操作时,使用别名pp作为父信息,父行中的字段可用作pp.page_idpp.name,两者都是如果父母不存在,则NULL

因此,以下查询将包含父项中的字段:

SELECT p.id, p.name, '0' AS page_exists,
       pp.page_id AS parent_id, pp,name AS parent_name      
FROM pages p
LEFT JOIN pages pp 
ON (pp.page_id=p.parent) 
WHERE p.page_type=3 
ORDER BY name ASC

为了在父项不存在时获得0和''而不是NULL,您可以在CASE子句中使用SELECT语句:

SELECT pp.id, pp.name, '0' AS page_exists,
      CASE WHEN pp.page_id THEN pp.page_ID ELSE 0 END AS parent_id,
      CASE WHEN pp.name THEN pp.name ELSE '' AS parent_name