重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
例子语句(表名TAB1,时间字段D1,D2,D3,D4,D5):
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、虚拟空间、营销软件、网站建设、宁武网站维护、网站推广。
SELECT GREATEST(D1,D2,D3,D4,D5), ......
FROM TAB1
ORDER BY 1 DESC
说明,需要使用GREATEST函数,不能用MAX,MAX是计算列最大值的。
-------------------------------------------方法1
select * from (
select
tablename_tmp.*,
@rownum:=@rownum+1 ,
if(time =DATE_FORMAT(now(),'%Y-%m-%d %H:00') ,@rank:=@rank+1,@rank:=0) as rank
from (
select * from tablename order by time desc
)
tablename_tmp ,
(select @rownum :=0 , @ptime := null ,@rank:=0) a
) a
order by rank desc ,time desc
---------------------------------------方法2
select * from tablename order by
(case when DATE_FORMAT(time ,'%k')=0 then 24 when DATE_FORMAT(time ,'%k')*1=DATE_FORMAT(now(),'%k')*1 then DATE_FORMAT(time ,'%k') else 25 end) ,time desc
题主测试一下?你这里的24点应该是第二天的00:00:00 。你这样排有什么用处?
有两个思路
1、按照各自的活动状态先排序,插入到临时表,最后再union all所有结果集
create temporary table tmp1
select * from tb where 活动状态='筹备中' order by 开始时间;
create temporary table tmp2
select * from tb where 活动状态='进行中' and 开始时间 is not null order by 开始时间;
create temporary table tmp3
select * from tb where 活动状态='进行中' and 开始时间 is null;
create temporary table tmp4
select * from tb where 活动状态='已结束' order by 开始时间 desc;
(select * from tmp1)
union all
(select * from tmp2)
union all
(select * from tmp3)
union all
(select * from tmp4)
2、通过field函数自定义排序
select * from tb order by field(活动状态,'筹备中','进行中','已结束') asc,开始时间 asc;
但这种只能按指定排序,你这种多种排序,有困难。
可以看看上面两种方法结合或许有更好的方法。
select * from (select 时间1 from 表1
union all
select 时间2 from 表2
…………
union all
select 时间N from 表N) as 表名
我只是简单写了一下,查询的是一个字段,要是你的表的字段是完全一样的话,就可以用 * 代替,要是不一样的话,可以手动按照顺序写对应的字段,要是字段个数不一样多的话,可以用''代替没有的字段,不知到我说的能否明白?
在MySQL中,可以指定按照多个字段进行排序。例如,可以使employee表按照d_id字段和age字段进行排序。排序过程中,先按照d_id字段进行排序,遇到d_id字段的值相等的情况时,再把d_id值相等的记录按照age字段进行排序。
查询employee表中的所有记录,按照d_id字段的降序方式和age字段的升序方式进行排序。