0

ここでデモを参照してください: 欠落している場所: 「スポーツ » ラグビー リーグ » 結果」およびその他のいくつか。

この問題は、WHERE の最後の IF ステートメントが原因で発生します。これは、ページ/親が 3 レベルの深さだけになるようにするために追加されました。これを削除すると、トップ レベルを参照しない "Football » Results » Championship" になります。

すべてがトップ 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 に答える