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
4

3 回答 3

7

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
于 2013-01-17T22:39:22.877 回答
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(最旧的在前)

(第二个和第三个是互换的)

于 2014-09-23T03:21:57.297 回答
-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;
于 2014-04-16T10:28:51.533 回答