2013-01-17 59 views
1

我有一个艺术画廊页面,其中有一个小组可以展示多达5个展览'在这个画廊'。有时可能会有很多,它应该显示当前或即将到来的第一,然后诉诸过去的展览。按最近日期排序,然后过去

是否可以在一个查询中执行?

下面会给我那些最接近的时间差方面,但我最终会在列表顶部越来越近的事件(因为如果它是一个一天的过去,这比在5天内即将发生的事件明显减少)

SELECT DATEDIFF(date_start, NOW()) as date_diff, exhibitions.* 
FROM  events 
WHERE event.gallery_id = XX 
ORDER BY date_diff asc 
LIMIT 5 
+0

如何通过start_date desc排序? –

回答

2

date_diff为过去的事件返回负值。这是一个修复:

SELECT DATEDIFF(date_start, NOW()) as date_diff, exhibitions.* 
FROM  events 
WHERE event.gallery_id = XX 
ORDER BY (case when date_diff < 0 then 1 else 0 end), 
     abs(date_diff) asc 
LIMIT 5 
-1

通常情况下,你不能在两个方向上排序一列。如果通过即将到来的ASC想哟为了过去DESC你可以用诡计做到这一点:

SELECT yourDateColumn,IF(yourDateColumn)<NOW(),DATEDIFF(yourDateColumn),NOW()) * -1000000000,UNIX_TIMESTAMP(STR_TO_DATE(CONVERT_TZ(e.startDate,e.timeZone,'Europe/Paris'), '%Y-%m-%d'))) AS diff FROM yourTable ORDER BY DIFF ASC; 
0

您可以通过date_start < CURDATE()命令将返回0或者1,0是未来的,1个是过去的,如果你订购

ORDER BY 
    (date_start < CURDATE()) ASC, 
    (greatest(date_start, CURDATE()) ASC, 
    (least(date_start, CURDATE()) DESC 
过去之前

第一个排名的将来,第二个订单未来ASC(最接近第一),第三个订单:结果ASC那么这将确保将来的过去的人

例如之前总是出现过去的DESC(最早的第一个)

(第二个和第三个是交换)

相关问题