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

选择它们,但显然,将 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

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" 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 回答
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 回答
0

使用TSQL CASE 表达式

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