0

スライダー付きのテーブルがあります。

 | id | position | 
 | 1  | 2        | 
 | 2  | 0        | 
 | 3  | 0        | 
 | 4  | 1        | 

そして、それらを、で並べ替えたいと思いますposition。ここで、0の位置はソートされていないかのように扱われます。ソートされていないレコードは、他の列(created_at)でソートする必要があります。例として、二次ソートとしてのIDによる順序付けは問題ありません。

シンプルな

SELECT "sliders".* FROM "sliders" ORDER BY position ASC, id ASC

それらを選択しますが、明らかに、1の上に0を並べ替えて、次のようにします。

 | id | position | 
 | 2  | 0        | 
 | 3  | 0        | 
 | 4  | 1        | 
 | 1  | 2        | 

しかし、次を返すクエリが必要です。

 | id | position | 
 | 4  | 1        | 
 | 1  | 2        | 
 | 2  | 0        | 
 | 3  | 0        | 

ソートされたアイテムの下に「ソートされていない」アイテムをソートします。

これはSQLで可能ですか?もしそうなら、どのように?これはまったく良いアプローチですか、それとも「is_sorted」フラグを含む別の列などを使用したほうがよいでしょうか。

私はActiveRecord(Ruby on Rails)をORMとして使用しているので、これを簡単にするヘルパーを提供しているのでしょうか?

編集:SQLは現在sqlite用ですが、MySQLに移植可能である必要があります。

4

4 に答える 4

3
order by
   case when position = 0 then 2 else 1 end,
   position

最初にすべてのゼロを最後に強制し、次に位置順に並べます

于 2013-03-22T12:57:30.997 に答える
2
SELECT "sliders".* 
FROM   "sliders" 
ORDER  BY CASE WHEN position = 0 THEN 0 ELSE 1 END DESC, 
          position ASC, 
          id ASC
于 2013-03-22T12:57:57.903 に答える
2

このようなことをしてもらえますか?私はそれがうまくいくと確信しています。

SELECT "sliders".* FROM "sliders" where position != 0 ORDER BY position ASC, id ASC
UNION
SELECT "sliders".* FROM "sliders" where position = 0 ORDER BY id ASC
于 2013-03-22T12:58:41.687 に答える
0

TSQLCASE式を使用します。

SELECT "sliders".* FROM "sliders" 
ORDER BY CASE WHEN position = 0 THEN 999 ELSE position END, id ASC
于 2013-03-22T12:57:40.903 に答える