我有一个艺术画廊页面,其中有一个展示多达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 :(得分:3)
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 :(得分:1)
您可以按date_start < CURDATE()
订购,它将返回0或1,0将来,1过去,如果您订购结果ASC,那么它将确保将来的那些总是出现在过去之前
例如:
ORDER BY
(date_start < CURDATE()) ASC,
(greatest(date_start, CURDATE()) ASC,
(least(date_start, CURDATE()) DESC
第一个排在过去之前的未来,第二个排序未来的ASC(最接近的第一个),第三个排序过去的DESC(最早的第一个)
(第二和第三个是交换)
答案 2 :(得分:-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;