mysql - 按 "position"排序,但最后放置 0

标签 mysql sql sqlite sorting activerecord

我有一张带 slider 的 table :

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

我想按位置 对它们进行排序,其中位置 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。

最佳答案

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

首先强制所有零排在最后, 然后,按位置排序

关于mysql - 按 "position"排序,但最后放置 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15570873/

相关文章:

json - Sqlite:将新元素附加到现有数组

sqlite - 如何增加一定数量的值(value)?

c++ - SQLite重命名空表

php - 使用 php 将 XML 嵌套到 MySQL 表

php - 如何使用 moodle 为管理端和前端设置不同的 css?

javascript - Android/iOS 浏览器提交隐藏字段数据不起作用

SQL插入同时检查其中一个键是否等于另一个表中的字段

mysql - 比较 mysql 时间戳

sql - 如何使用 PostGIS 创建和查询包含经/纬度的表?

mysql - 避免/删除表中的重复行