现在有一BT需求,是排序显示的问题。
》数据库字段如下:
id title message_time_start message_time_end create_time
看着貌似没什么吧,好吧,问题来了。
》要求如下:
1、最新发布的信息(create_time)放在前面,但是这里必须是没有过期的信息(message_time_end >= create_time , 当message_time_end的数据为null时,按create_time进算。),该信息排列最前面。
2、message_time_end 为 NULL时,且create_time非今天的数据时,只取create_time距现在过期3天的信息,该信息排列中间。
3、已过期的信息( message_time_end<now() ),只取过期3天的数据,该信息排列最后面。本人黔驴技穷,请高人指点。不为您的答案,哪怕有个思路也好,虚心学习。
》数据库字段如下:
id title message_time_start message_time_end create_time
看着貌似没什么吧,好吧,问题来了。
》要求如下:
1、最新发布的信息(create_time)放在前面,但是这里必须是没有过期的信息(message_time_end >= create_time , 当message_time_end的数据为null时,按create_time进算。),该信息排列最前面。
2、message_time_end 为 NULL时,且create_time非今天的数据时,只取create_time距现在过期3天的信息,该信息排列中间。
3、已过期的信息( message_time_end<now() ),只取过期3天的数据,该信息排列最后面。本人黔驴技穷,请高人指点。不为您的答案,哪怕有个思路也好,虚心学习。
数据要有代表性
select *
from tb
where create_time between message_time_start and (case when message_time_end is null then create_time else message_time_end end)
order by create_time desc;
2
select *
from tb
where create_time <> date(now()) and message_time_end is null and create_time>date_add(now() ,interval -3 day);
3
select *
from tb
where message_time_end<now() and message_time_end>date_add(now() ,interval -3 day);
from 数据库字段如下
where (message_time_end>now()-interval 3 day)
or (message_time_end is null and create_time<now + interval 3 day)
or (message_time_end >= create_time)
order by (message_time_end>=now() or message_time_end is null) , (message_time_end is null and create_time<now + interval 3 day) desc ,create_time desc