mysql中order by 可以指定排序
2017-05-19 17:01
183 查看
mysql表的排序 ORDER BY field1 [ASC [DESC]], [field2…] [ASC [DESC]],…
这里是想让它以 num 排序 但是 num=-1的那条数据单独为最大值
法一:field( field1,val1,val2,…)
这里大小顺序是 … >val2 >val1 >field1(其他的数据) 子后向前=》从大到小
order by field 时 Using filesort(一种速度比较慢的外部排序) , 一般不建议使用
select * from test order by field(num,-1) asc,num asc;
法二:case when … then … when … then … else … end
select * from test order by case when num = -1 then 1 else 0 end desc;
数据分为2个部分:
我认为 表中的数据分为两部分, num=-1的一条拿出来作为最大值(特殊部分),然后其他的作为一个整体(其他部分) 然后2个部分进行排序,再用 进行一次排序可达到想要的效果
方法中的2个例子结果是一样的,但是想对来说第二种用出多些,因为它可以自由选择大、小的作为特殊部分
这里是想让它以 num 排序 但是 num=-1的那条数据单独为最大值
法一:field( field1,val1,val2,…)
这里大小顺序是 … >val2 >val1 >field1(其他的数据) 子后向前=》从大到小
order by field 时 Using filesort(一种速度比较慢的外部排序) , 一般不建议使用
select * from test order by field(num,-1) asc,num asc;
法二:case when … then … when … then … else … end
select * from test order by case when num = -1 then 1 else 0 end desc;
数据分为2个部分:
我认为 表中的数据分为两部分, num=-1的一条拿出来作为最大值(特殊部分),然后其他的作为一个整体(其他部分) 然后2个部分进行排序,再用 进行一次排序可达到想要的效果
方法中的2个例子结果是一样的,但是想对来说第二种用出多些,因为它可以自由选择大、小的作为特殊部分
#表 test 共有2个字段 id,name mysql> desc test; +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | num | int(11) | NO | | 0 | | +-------+------------------+------+-----+---------+----------------+ mysql> select * from test; +----+-----+ | id | num | +----+-----+ | 1 | -1 | | 2 | 0 | | 3 | 1 | | 4 | 2 | | 5 | 3 | | 6 | 4 | | 7 | 5 | +----+-----+
#两种方法获取到相同的排序 num=-1 作为最大值排序 mysql> select * from test order by field(num,-1) desc; mysql> select * from test order by case when num = -1 then 1 else 0 end desc; +----+-----+ | id | num | +----+-----+ | 1 | -1 | | 2 | 0 | | 3 | 1 | | 4 | 2 | | 5 | 3 | | 6 | 4 | | 7 | 5 | +----+-----+ mysql> select * from test order by field(num,-1) asc; mysql> select * from test order by case when num = -1 then 1 else 0 end asc; +----+-----+ | id | num | +----+-----+ | 2 | 0 | | 3 | 1 | | 4 | 2 | | 5 | 3 | | 6 | 4 | | 7 | 5 | | 1 | -1 | +----+-----+ #当进行二次排序时,得到了想要的结果 mysql> select * from test order by field(num,-1) desc,num desc; mysql> select * from test order by case when num = -1 then 1 else 0 end desc, num desc; +----+-----+ | id | num | +----+-----+ | 1 | -1 | | 7 | 5 | | 6 | 4 | | 5 | 3 | | 4 | 2 | | 3 | 1 | | 2 | 0 | +----+-----+ mysql> select * from test order by field(num,-1) asc,num asc; mysql> select * from test order by case when num = -1 then 1 else 0 end asc, num asc; +----+-----+ | id | num | +----+-----+ | 2 | 0 | | 3 | 1 | | 4 | 2 | | 5 | 3 | | 6 | 4 | | 7 | 5 | | 1 | -1 | +----+-----+ #这里是 num=2 作为最大值进行倒序排序 所以num=2在最前面 mysql> select * from test order by case when num = 2 then 1 else 0 end desc; +----+-----+ | id | num | +----+-----+ | 4 | 2 | | 1 | -1 | | 2 | 0 | | 3 | 1 | | 5 | 3 | | 6 | 4 | | 7 | 5 | +----+-----+ # 这里是 num=2 作为最小值进行正序排序 所以num=2在最前面 mysql> select * from test order by case when num = 2 then 0 else 1 end; +----+-----+ | id | num | +----+-----+ | 4 | 2 | | 1 | -1 | | 2 | 0 | | 3 | 1 | | 5 | 3 | | 6 | 4 | | 7 | 5 | +----+-----+
相关文章推荐
- mysql 排序order by可以根据权重,进行表达式计算。再排序
- 学习:根据指定字段排序编号(SQL Server 2005,Update,Order By) (转)
- MySQL 中的ORDER BY两种排序实现方式
- mysql 按指定数组排序
- 关于Mysql的字段长度---显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示
- 利用Dataview实现搜索指定目录下的所有文件,以指定的条件排序(可以按文件名升降序,最后修改时间升降序)
- Order by 按指定顺序进行排序
- mysql中随机获取排序条件中的指定数量数据
- MySQL如何利用索引优化ORDER BY排序语句
- MYSQL创建数据库时候直接指定编码和排序规则
- MySQL也有潜规则 – Select 语句不加 Order By 如何排序?
- MySQL如何利用索引优化ORDER BY排序语句
- MySQL如何利用索引优化ORDER BY排序语句
- MySQL 按指定字段自定义列表排序
- 通过Order by按指定顺序排序
- MySQL在排序时(Order by), Null值在什么位置?
- mysql 某列指定值靠前排序
- MYSQL创建数据库时候直接指定编码和排序规则
- MySQL如何利用索引优化ORDER BY排序语句
- Mysql查询按照某字段指定顺序排序