1

「このギャラリーで」最大 5 つの展示を示すパネルを備えたアート ギャラリー ページがあります。時には多くの展示があるかもしれませんが、最初に現在または今後の展示を表示し、次に過去の展示に頼る必要があります.

1つのクエリで実行できますか?

以下は、日付の違いの点で最も近いものを提供しますが、リストの一番上に過去のイベントを取得することになります (1 日過ぎた場合、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は、過去のイベントに対して負の値を返します。これは1つの修正です:

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

0 または 1 を返す順序を指定できdate_start < CURDATE()ます。0 は未来、1 は過去です。結果の ASC を並べ替えると、未来のものは常に過去のものより前に表示されます。

例えば:

ORDER BY
  (date_start < CURDATE()) ASC,
  (greatest(date_start, CURDATE()) ASC,
  (least(date_start, CURDATE()) DESC

1 つ目は過去の前に未来をランク付けし、2 つ目は未来の ASC (近い順) を並べ替え、3 つ目は過去の DESC (古い順) を並べ替えます。

(2番目と3番目は交換です)

于 2014-09-23T03:21:57.297 に答える
-1

通常、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 に答える