0

在此处查看演示: 缺少的地方:“体育»橄榄球联盟»结果”和其他一些。

问题是由 WHERE 中的最后一个 IF 语句引起的。添加它是为了确保页面/父级只会深入 3 级,当您删除它时,我们最终会得到“足球»结果»冠军”,它不参考顶级。

一切都指向顶部 page_id = 1。

SELECT
    p1.page_id,
    IF( p1.parent_page_id >1,
    (    SELECT
        IF( p2.parent_page_id >1,
        (    SELECT
            CONCAT( pd3.page_description_name,
            ' » ',
            pd2.page_description_name,
            ' » ',
            pd1.page_description_name )  
        FROM
            pages p3  
        LEFT JOIN
            page_descriptions pd3 
                ON pd3.page_id = p3.page_id  
                AND pd3.language_id = '1'  
        WHERE
            p3.page_id = p2.parent_page_id  LIMIT 1 ) ,
        CONCAT( pd2.page_description_name,
        ' » ',
        pd1.page_description_name ) )  
    FROM
        pages p2  
    LEFT JOIN
        page_descriptions pd2 
            ON pd2.page_id = p2.page_id  
            AND pd2.language_id = '1'  
    WHERE
        p2.page_id = p1.parent_page_id  LIMIT 1  ), pd1.page_description_name  ) AS path  
FROM
    pages p1  
LEFT JOIN
    page_descriptions pd1 
        ON pd1.page_id = p1.page_id  
        AND pd1.language_id = '1'  
WHERE
    IF( p1.parent_page_id >1, (    SELECT
        IF( p3.parent_page_id  IN ( 1,
        0 ) ,
        1,
        0 )  
    FROM
        pages p3  
    WHERE
        p3.page_id = p1.parent_page_id  LIMIT 1 ) , 1  )  
    AND p1.page_id !=1  
ORDER BY
    path
4

1 回答 1

1

有点大规模的连接,正如 Mike Brant 在评论中指出的那样,如果它是一个经常运行的查询,你可能最好查看另一个结构,但据我了解要求,这应该适用于你当前的数据放;

SELECT a.page_id,CONCAT_WS(' » ',c.page_description_name,
                                 b.page_description_name,
                                 a.page_description_name) path
FROM page_descriptions a
LEFT JOIN pages a1 
  ON a.page_id = a1.page_id AND a1.parent_page_id <>1
LEFT JOIN page_descriptions b
  ON b.page_id = a1.parent_page_id
LEFT JOIN pages b1 
  ON b.page_id = b1.page_id AND b1.parent_page_id <>1
LEFT JOIN page_descriptions c
  ON c.page_id = b1.parent_page_id
LEFT JOIN pages c1 
  ON c.page_id = c1.page_id  AND c1.parent_page_id <>1
WHERE (c1.parent_page_id IS NULL OR c1.parent_page_id=0)
  AND a.page_description_id <> 1

一个用于测试的 SQLfiddle

于 2013-03-05T20:29:30.443 回答