0

次の日付と前の日付を取得する必要があります

テーブル構造は次のとおりです

| auto_id | id | next_date  | next_activity |
|    1    |  1 | 22-12-2012 |     -         |
|    2    |  1 | 25-12-2012 |     -         |
|    3    |  1 | 26-12-2012 |     -         |
|    4    |  1 | 28-12-2012 |     -         |

だから私は next_day と previous_day が必要です next_day = 現在の日の後の next_date

(SELECT * FROM `activity` WHERE id = 1 and next_date > CURDATE() order by next_date asc limit 1)
UNION
(SELECT * FROM `activity` WHERE id = 1 and next_date = CURDATE() )
UNION
(SELECT * FROM `activity` WHERE id = 1 and next_date < CURDATE() order by next_date desc limit 1)
ORDER BY next_date desc limit 2

テーブルに参加する他の方法...

テーブルを最適化する方法はありますか

4

1 に答える 1

1

別の方法は次のとおりです。

SELECT next_date, date_diff
 FROM (SELECT *,
               @dateDiff := datediff(next_date, curdate()) AS date_diff,
               @pDateDiff :=
                  IF((@dateDiff < 0 AND @dateDiff > @pDateDiff),
                     @dateDiff,
                     @pDateDiff)
                  AS pDateDiff,
               @nDateDiff :=
                  IF((@dateDiff > 0 AND @dateDiff < @nDateDiff),
                     @dateDiff,
                     @nDateDiff)
                  AS nDateDiff
          FROM activity, (SELECT @pDateDiff := -9999, @nDateDiff := 9999) tmp
          WHERE id = 1) aView
 WHERE date_diff IN (@pDateDiff, 0, @nDateDiff)
ORDER BY next_date;

date_diff値は、前後の日付の見通しを示します。

  • すべての日付を選択してくださいid = 1
  • と の日付の差を見つけてnext_datecurdate()ユーザー定義変数に保存します@dateDiff
  • @pDateDiff は、負の@dateDiff値 (前の日付) の最大値を追跡する別の変数です。
  • @nDateDiff は、正の値の最小@dateDiff値 (次の日付)を追跡するもう 1 つの変数です。
  • 最後に、 にある日付のみを選択します(-ve max, 0, +ve min)

PS: 日付エントリが重複している場合、クエリはそれらすべてを返す可能性があります。

于 2013-02-26T10:50:24.497 に答える