1

次の(簡略化された)構造のテーブルがあります。

INT id,
INT type,
INT sort

必要なのは、次のようにデータを並べ替えるSELECTです。

  • sort同じタイプのすべての行は順番に並べられ、内部で昇順で並べ替えられ、
  • 1つのタイプのすべての「ブロック」は、最小値でソートされますsort

例:

テーブルが次のようになっている場合:

| id | type | sort |
|  1 |   1  |   3  |
|  2 |   3  |   5  |
|  3 |   3  |   1  |
|  4 |   2  |   4  |
|  5 |   1  |   2  |
|  6 |   2  |   6  |

クエリは次のように結果を並べ替える必要があります。

| id | type | sort |
|  3 |   3  |   1  |
|  2 |   3  |   5  | 
|  5 |   1  |   2  |
|  1 |   1  |   3  | 
|  4 |   2  |   4  |
|  6 |   2  |   6  | 

これで十分に明確になることを願っています。

これは非常に一般的な要件であるため、私には見えますが、自分でユースケースに転送できるほど近い例は見つかりませんでした。少なくとも1つのサブクエリを回避することはできないと思いますが、自分でそれを理解することはできませんでした。

よろしくお願いします。

ちなみに、このクエリはCakePHP 2.1で使用するので、Cakeで快適に実行できる方法をご存知の場合は、お知らせください。

4

2 に答える 2

4

これは、最初に聞こえるよりも簡単です。私は次のことがトリックを行うべきだと信じています:

SELECT a.id, a.type, a.sort
FROM Some_Table as a
JOIN (SELECT type, MIN(sort) as min
      FROM Some_Table
      GROUP BY type) as b
ON b.type = a.type
ORDER BY b.min, a.type, a.sort

type最良の(最速の)結果を得るには、おそらく( 、 )のインデックスが必要になりますsort。同じ値のグループが2つある場合は、 ((、)の代わりに)
追加の並べ替えが必要です(行が混在することになります)。重複する値がない場合は、削除できます。a.typeb.mina.sortsort

于 2012-05-25T23:07:43.593 に答える
0

ソートとタイプは一部のデータベースでは予約語であり、問​​題を引き起こす可能性があります。

やってみました?

ORDER BY TYPE DESC, SORT ASC
于 2012-05-25T23:02:53.907 に答える