2

ORDER BY次の順序でテーブルからレコードを取得するために日付を使用しようとしています:

TODAY (9 PM)
TODAY (7 PM)
TODAY (9 AM)
TODAY (7 AM)
PAST (3 DAYS AGO)
PAST (2 DAYS AGO)
PAST (1 DAYS AGO)
FUTURE (IN 1 DAY)
FUTURE (IN 2 DAYS)
FUTURE (IN 3 DAYS)

現在私は使用しています:

SELECT * 
FROM my_table 
ORDER BY 
    IF(DATE(my_date) = DATE(NOW()), 0, 1) ASC,
    IF(DATE(my_date) < DATE(NOW()), 0, 1) ASC,
    my_date ASC

しかし、それは私に与えます:

TODAY (7 AM) - WRONG
TODAY (9 AM) - WRONG
TODAY (7 PM) - WRONG
TODAY (9 PM) - WRONG
PAST (3 DAYS AGO)
PAST (2 DAYS AGO)
PAST (1 DAYS AGO)
FUTURE (IN 1 DAY)
FUTURE (IN 2 DAYS)
FUTURE (IN 3 DAYS)

を使用して「今日」の並べ替えを変更してみましたDESC

IF(DATE(my_date) = DATE(NOW()), 0, 1) DESC,

しかし、その後、レコードを一番下に送信するだけです (将来の結果の下であっても)。これは SQL だけで可能ですか、それとも CodeIgniter を使用して複数のクエリを実行where()し、PHP を使用してそれらをマージする必要がありますか?

4

3 に答える 3

8

これは指定された要件を満たすと思います:

SELECT t.*
  FROM my_table t
 ORDER
    BY DATE(t.my_date)=DATE(NOW()) DESC
     , IF(DATE(t.my_date)=DATE(NOW()),t.my_date,DATE(NULL)) DESC
     , t.my_date ASC

少し開梱してみましょう。

ORDER BY の最初の式は、1(条件テストが true の場合)、0(false の場合)、またはNULL(式の 1 つが NULL の場合) に評価されます。条件が一致する行を取得するには、降順が必要です。 'true' が最初にソートされます。

2 番目の式は IF 関数です。my_date 値の日付部分が今日の日付である場合、 を返しmy_dateます。(仕様に従って)降順でソートする必要があります。それ以外の場合は、定数を返したいので、残りの行はすべて「等しい」と見なされます。

3 番目に、my_date 値の昇順で並べ替えます。これは今日の行には影響しません。それらはすでに降順に並べられているため、これは実際には、この時点まで「等しい」行 (「今日ではない」) にのみ影響します。my_date 値が NULL の行はすべて最後に配置する必要があります (ORDER BY の最初の式が実際にそれを保証します)。

于 2013-09-12T20:47:18.063 に答える
4

Parado の答えは、値を正しく分離します。しかし、順序もグループによって異なります。値は、当日は降順で、他の日は昇順です。1 つの方法を次に示します。

SELECT * 
FROM my_table 
ORDER BY (case when DATE(my_date) = DATE(NOW())
               then my_date
               else date('2000-01-01')
          end
         ) desc,
         my_date asc;

2 番目の 2 つのグループは組み合わせることができます。日付を昇順に並べると、過去が未来よりも先になります。

編集:

`date('2000-01-01') の目的は、NULL 値 (つまり、今日ではない) を最後にすることです。これは、次の 3 つの部分のロジックで行うことができます。

SELECT * 
FROM my_table 
ORDER BY (case when DATE(my_date) = DATE(NOW()) then 1 else 2 end),
         (case when DATE(my_date) = DATE(NOW())
               then my_date
          end
         ) desc,
         my_date asc;
于 2013-09-12T20:43:44.077 に答える