按“位置”排序,但最后排名0

时间:2013-03-22 12:55:02

标签: mysql sql sqlite sorting activerecord

我有一张带滑块的表格:

 | 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

选择它们,但是,显然,将0排在1之上,给我:

 | 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 个答案:

答案 0 :(得分:3)

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

首先强制全部为零, 那么,按职位排序

答案 1 :(得分:2)

SELECT "sliders".* 
FROM   "sliders" 
ORDER  BY CASE WHEN position = 0 THEN 0 ELSE 1 END DESC, 
          position ASC, 
          id ASC

答案 2 :(得分: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

答案 3 :(得分:0)

使用TSQL CASE expression

SELECT "sliders".* FROM "sliders" 
ORDER BY CASE WHEN position = 0 THEN 999 ELSE position END, id ASC