sql语句order by多条件排序

时间:2022-02-09 23:04:40
order by (case  when type=‘vip’ and level = '1' then 1 when type=‘vip’ and level = '0' then 2 else 99 end), creatTime desc
我希望先类型type为vip的排在最前,
其次vip按照级别level为“1”排前面,“0”排后面
最后vip按创建时间creatTime升序排列
非vip按创建时间creatTime倒序排列
求教,主要是后面这个creatTime排序该怎么写 sql语句order by多条件排序

13 个解决方案

#1


把 creatTime 转换成一个整数,例如:毫秒值,然后 vip 的 乘-1,非vip 乘1

#2


说的不清不楚:
order by type desc,level desc,vip.createtime,notvip.createtime desc

#3


引用 2 楼 luo201227 的回复:
说的不清不楚:
order by type desc,level desc,vip.createtime,notvip.createtime desc

额,就是一张表有 type,level,creatTime这些字段,然后我想将查询结果排序
type为vip的排在最前
其次vip按照级别level为“1”排前面,“0”排后面,如果level相同的话按创建时间creatTime升序排列
非vip就一个排序,按创建时间creatTime倒序排列
比如:
-----------------------------
type  level   creatTime
vip     0          10
vip     1           40
vip     0           30
vip     1           8
no     0           22
no     0            50
no     1            33

查询结果如下:
vip     1           8
vip     1           40
vip     0           10
vip     0           30
no     0            50
no     1            33
no     0            22
求大神教我飞 sql语句order by多条件排序

#4


引用 3 楼 hcrystald 的回复:
Quote: 引用 2 楼 luo201227 的回复:

说的不清不楚:
order by type desc,level desc,vip.createtime,notvip.createtime desc

额,就是一张表有 type,level,creatTime这些字段,然后我想将查询结果排序
type为vip的排在最前
其次vip按照级别level为“1”排前面,“0”排后面,如果level相同的话按创建时间creatTime升序排列
非vip就一个排序,按创建时间creatTime倒序排列
比如:
-----------------------------
type  level   creatTime
vip     0          10
vip     1           40
vip     0           30
vip     1           8
no     0           22
no     0            50
no     1            33

查询结果如下:
vip     1           8
vip     1           40
vip     0           10
vip     0           30
no     0            50
no     1            33
no     0            22
求大神教我飞 sql语句order by多条件排序

那sql基本上满足你的需求了。。。。自己好好试试看

#5


这个问题我已经解决了,用的是这个
select * from(select * from person_info t where t.type='vip' order by (case when t.level='1' then 1 when t.level='0' then 2 else 0 end),t.creatTime)
UNION ALL
select * from(
select * from person_info t where t.type='no' order by t.creatTime DESC)

不清楚有没有更好的方法 sql语句order by多条件排序

#6


排序尽量在业务逻辑中处理,尽量减少在数据库中直接排序

#7


不能再代码中直接拼接order by 后面的东西么?

#8


引用 5 楼 hcrystald 的回复:
这个问题我已经解决了,用的是这个
select * from(select * from person_info t where t.type='vip' order by (case when t.level='1' then 1 when t.level='0' then 2 else 0 end),t.creatTime)
UNION ALL
select * from(
select * from person_info t where t.type='no' order by t.creatTime DESC)

不清楚有没有更好的方法 sql语句order by多条件排序

貌似没有更好的办法呢。

#9


字符串也可以比较大小的!
 order by t.type desc,t.creatTime desc

#10


select type,level,createTime from
(
select 
type,
level,
createTime,
case when type=='no' then -1 else level end level_forOrder,
case when type=='no' then createTime*-1 else createTime end createTime_forOrder 
from person_info
) order by type desc,level_forOrder asc,createTime desc
 试试

#11


我是来学习的

#12


你在order by 后面可不可以这样搞 
case when type='vip' then asc else desc end

#13


你这样的方式 是可以的 10L也可以

#1


把 creatTime 转换成一个整数,例如:毫秒值,然后 vip 的 乘-1,非vip 乘1

#2


说的不清不楚:
order by type desc,level desc,vip.createtime,notvip.createtime desc

#3


引用 2 楼 luo201227 的回复:
说的不清不楚:
order by type desc,level desc,vip.createtime,notvip.createtime desc

额,就是一张表有 type,level,creatTime这些字段,然后我想将查询结果排序
type为vip的排在最前
其次vip按照级别level为“1”排前面,“0”排后面,如果level相同的话按创建时间creatTime升序排列
非vip就一个排序,按创建时间creatTime倒序排列
比如:
-----------------------------
type  level   creatTime
vip     0          10
vip     1           40
vip     0           30
vip     1           8
no     0           22
no     0            50
no     1            33

查询结果如下:
vip     1           8
vip     1           40
vip     0           10
vip     0           30
no     0            50
no     1            33
no     0            22
求大神教我飞 sql语句order by多条件排序

#4


引用 3 楼 hcrystald 的回复:
Quote: 引用 2 楼 luo201227 的回复:

说的不清不楚:
order by type desc,level desc,vip.createtime,notvip.createtime desc

额,就是一张表有 type,level,creatTime这些字段,然后我想将查询结果排序
type为vip的排在最前
其次vip按照级别level为“1”排前面,“0”排后面,如果level相同的话按创建时间creatTime升序排列
非vip就一个排序,按创建时间creatTime倒序排列
比如:
-----------------------------
type  level   creatTime
vip     0          10
vip     1           40
vip     0           30
vip     1           8
no     0           22
no     0            50
no     1            33

查询结果如下:
vip     1           8
vip     1           40
vip     0           10
vip     0           30
no     0            50
no     1            33
no     0            22
求大神教我飞 sql语句order by多条件排序

那sql基本上满足你的需求了。。。。自己好好试试看

#5


这个问题我已经解决了,用的是这个
select * from(select * from person_info t where t.type='vip' order by (case when t.level='1' then 1 when t.level='0' then 2 else 0 end),t.creatTime)
UNION ALL
select * from(
select * from person_info t where t.type='no' order by t.creatTime DESC)

不清楚有没有更好的方法 sql语句order by多条件排序

#6


排序尽量在业务逻辑中处理,尽量减少在数据库中直接排序

#7


不能再代码中直接拼接order by 后面的东西么?

#8


引用 5 楼 hcrystald 的回复:
这个问题我已经解决了,用的是这个
select * from(select * from person_info t where t.type='vip' order by (case when t.level='1' then 1 when t.level='0' then 2 else 0 end),t.creatTime)
UNION ALL
select * from(
select * from person_info t where t.type='no' order by t.creatTime DESC)

不清楚有没有更好的方法 sql语句order by多条件排序

貌似没有更好的办法呢。

#9


字符串也可以比较大小的!
 order by t.type desc,t.creatTime desc

#10


select type,level,createTime from
(
select 
type,
level,
createTime,
case when type=='no' then -1 else level end level_forOrder,
case when type=='no' then createTime*-1 else createTime end createTime_forOrder 
from person_info
) order by type desc,level_forOrder asc,createTime desc
 试试

#11


我是来学习的

#12


你在order by 后面可不可以这样搞 
case when type='vip' then asc else desc end

#13


你这样的方式 是可以的 10L也可以