2

だから私はこの次のクエリを修正しようとしています:

SELECT * FROM `#__gdwproddise_category` 
      ORDER BY IF(`parent_id`, `parent_id`, `ordering`), 
           `parent_id`, `ordering` asc

したがって、重要な MYSQL フィールドは次のとおりです。

`multicat_id` = primary key
`parent_id`
`ordering`

親カテゴリparent_id= 0 残り = 親へmulticat_id

それぞれの一意parent_id(=0 を含むため、親を含む) には、一意の順序がorderingフィールドに設定されています。

したがって、順序付けフィールドには、値が 1、2、3 などの複数の行があります (各値はそれぞれの中で一意です)。parent_id

like parent_id=0 will only have 1 row with ordering set to 1.
and parent_id=1 will only have 1 row with ordering set to 1.
etc.

次のように出力したい:

parent (ordering=1)
-child (ordering=1)
-child (ordering=2)
parent (ordering=2)
-child (ordering=1)
etc.

この次のクエリはほとんど機能しているようです。ただし、親はorderingフィールドによって順序付けられていません..主キーによって順序付けられているようです。

SELECT * FROM `#__gdwproddise_category` 
     ORDER BY IF(`parent_id`, `parent_id`, `multicat_id`), 
         `parent_id`, `ordering` asc

一番上に投稿した最初のクエリは、これを修正しようとした私の推論でしたが、うまくいきません...最初のクエリはうまく機能します。少なくとも親と子は最初のグループにまとめられます。この 2 番目のものは、子から親をグループ化します。子供たちはくっついているようです。

次のスレッドからの回答の 1 つに示されている例に基づいて、クエリを作成しました 。SQL ネストされた順序は?

この記事を見つけました: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

その記事の「ltg rtg」ソリューションを使用するのは複雑に思えますが、私が使用しているクエリがほぼ正確に機能する場合、その記事は無限のサブカテゴリをサポートしているようです...私のシステムには 1 レベルのサブカテゴリしか必要ありません.

4

1 に答える 1

3

結果の適切な場所に子行のブロックを配置するには、親の順序を知る必要があるため、おそらく自己結合を使用する必要があります。

次のクエリは、必要な順序を示しているようです。

SELECT C.* FROM categories AS C
LEFT JOIN categories AS P
ON P.multicat_id = C.parent_id
ORDER BY IF(P.multicat_ID, P.ordering, C.ordering),
         P.ordering, C.ordering;

http://www.sqlfiddle.com/#!2/ba095/1/0でテストできます。

于 2013-03-06T20:49:54.280 に答える