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排序该怎么写
13 个解决方案
#1
把 creatTime 转换成一个整数,例如:毫秒值,然后 vip 的 乘-1,非vip 乘1
#2
说的不清不楚:
order by type desc,level desc,vip.createtime,notvip.createtime desc
#3
额,就是一张表有 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
求大神教我飞
#4
那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)
不清楚有没有更好的方法
#6
排序尽量在业务逻辑中处理,尽量减少在数据库中直接排序
#7
不能再代码中直接拼接order by 后面的东西么?
#8
这个问题我已经解决了,用的是这个
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)
不清楚有没有更好的方法
貌似没有更好的办法呢。
#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
说的不清不楚:
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
求大神教我飞
#4
说的不清不楚:
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基本上满足你的需求了。。。。自己好好试试看
#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)
不清楚有没有更好的方法
#6
排序尽量在业务逻辑中处理,尽量减少在数据库中直接排序
#7
不能再代码中直接拼接order by 后面的东西么?
#8
这个问题我已经解决了,用的是这个
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)
不清楚有没有更好的方法
貌似没有更好的办法呢。
#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