5

私はこのようなテーブルを持っています -

id  name        ordering    catid 
1   parent1         1         0
2   parent2         2         0
3   parent3         3         0
4   child11         1         1
5   child12         2         1
6   child21         1         2
7   child22         2         2
8   child31         1         3
9   child32         2         3

私は以下のような結果を得ようとしています -

id  name        ordering    catid 
1   parent1         1         0
4   child11         1         1
5   child12         2         1
2   parent2         2         0
6   child21         1         2
7   child22         2         2
3   parent3         3         0
8   child31         1         3
9   child32         2         3

parent(catid=0)2番目の親とその子よりも1番目をその子よりも注文したい。これらの列で希望の結果を達成することは可能ですか?参加しようとしましたが、成功しませんでした. 確かに私はそれを正しくやっていません。これは私が試したことです-

SELECT a.*,c.name AS category_title FROM table AS a 
LEFT JOIN table AS c ON c.id = a.catid 
ORDER BY c.ordering asc, a.ordering asc
4

3 に答える 3

5

このクエリはSELF JOIN、最初のテーブルのレコードを対応する親レコードと結合することにより、同じテーブルに対して実行します。列parentIdには、親が存在する場合はレコードの親IDが含まれ、そうでない場合はレコード自体のIDが含まれます。次に、結果はparentId、次にIDの順で並べられるため、親とその子の特定のグループで親が常に一番上に表示されます。

SELECT
    m.id, 
    m.name, 
    m.catid, 
    m.ordering, 
    p.ordering,
    case 
        WHEN p.ordering IS NULL THEN m.ordering * 10
        ELSE m.ordering + p.ordering * 10
    END AS parentId
FROM
    MyTable m
    LEFT JOIN MyTable p
    ON m.catid = p.id
ORDER BY parentId

結果は次のとおりです。

1   parent1 0   1       10
4   child11 1   1   1   11
5   child12 1   2   1   12
2   parent2 0   2       20
6   child21 2   1   2   21
7   child22 2   2   2   22
3   parent3 0   3       30
8   child31 3   1   3   31
9   child32 3   2   3   32
于 2012-10-13T13:39:44.137 に答える
0

これは、それがどれほど優れているかはわかりませんが、私が思う1つの実装である可能性があります。

  • weightという名前のテーブルに属性を追加します。
  • いずれかの行が子である場合、その重みは(catid * maximum_id + ordeing)になり、そうでない場合、重みは(ordering * maximum_id)になります[2つの条件に対して重み属性を2回変更することで実行できます]
  • 次に、必要なものを選択し、重量で並べ替えます。
  • テーブルから列の重みを削除します
于 2012-10-13T14:03:55.480 に答える