我有一张带滑块的表格:
| 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。
答案 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)
SELECT "sliders".* FROM "sliders"
ORDER BY CASE WHEN position = 0 THEN 999 ELSE position END, id ASC