-2

再帰句に基づくクエリに問題があります。

menu (メニュー カテゴリ) と menu_items (これらのカテゴリのアイテム) の 2 つのテーブルがあります。これらのテーブルは結合されています。各カテゴリにはいくつかのアイテムを含めることができます。サイト上のメニューの表示順序は、列「menuitem_next」に基づいています。結合列は menuitem_parent です。そして今、メニューを表示したいので、クエリを使用します:

select * from menu m left join 
    (With RECURSIVE submenu AS 
        (Select * from menu_item where menuitem_name not in 
            (select menuitem_next from menu_item where menuitem_next is not null) 
        Union all 
            SELECT mi.* FROM menu_item AS mi JOIN submenu AS sm ON 
                (mi.menuitem_name=sm.menuitem_next)
        ) 
        SELECT * FROM submenu 
     )r 
on m.menu_id=r.menuitem_parent order by m, r

また、結果クエリの順序が正しくありません。カテゴリは ID で並べ替えられ、メニュー項目は「menuitem_next」列で適切に並べ替えられます。このクエリを変更したり、新しいものを書いたりするのを手伝ってくれる人はいますか?

英語が下手で申し訳ありません。

よろしく

4

1 に答える 1

1

外側のクエリに がない限り、クエリに対して定義された特定の順序はありませORDER BYん。

あなたのクエリの構築は非常に奇妙です。そのため、CTE を外部クエリとして保持するように再構築しました。

WITH RECURSIVE 
submenu AS (
    SELECT * from menu_item 
    WHERE menuitem_name NOT IN (
        SELECT menuitem_next
        FROM menu_item 
        WHERE menuitem_next IS NOT NULL
    ) 
    UNION ALL
     SELECT mi.* FROM menu_item AS mi 
     INNER JOIN submenu AS sm
     ON (mi.menuitem_name=sm.menuitem_next)
)
SELECT * 
FROM menu m
LEFT OUTER JOIN submenu sm
ON m.menu_id = sm.menuitem_parent
ORDER BY m, sm;

この時点で、あなたのORDER BY句はからのフィールドではなく、からのタプル全体にあることが明らかになります。submenuおそらく、特定のフィールドで注文するつもりでしたか?

でフィールドリストを指定していないSELECTので、実際にフィールドが何であるかわかりません。後でテーブルに列を追加すると予期しない結果が生じるため、これはあまり良い方法ではありません。書くのではなく、常に列を明示的にリストする必要がありますSELECT *

于 2013-07-02T08:16:24.920 に答える