2016-11-21 12 views
0

これが可能かどうかはわかりませんが、私が探しているものはMysql - レコードの最後のN日後に作成された最新のレコード

私は現在の日付が必要です作成された最後のレコードの日数がN日を超えているか、または作成された最初のレコードのcreated_at日付の後にN日後に作成された最初のレコードのcreated_at

したがって、 N日以上の差があり、その2つの日付の間に他のレコードが作成されていない場合は、すべてのレコードの最新のcreated_atがN日前に作成されていない限り、最近作成されたレコードのcreated_atを返します。 teの代わりに

ので、私は6 days agoなく13 days agoまたは5 days agoを取得する必要があり、そしてレコードがこの

+----+-------------+ 
|id |created_at | 
+----+-------------+ 
|5 |11 day ago | < not this date, instead today's date 
|4 |12 days ago | 
|3 |20 days ago | 
|2 |21 days ago | 
|1 |30 days ago | 
+----+-------------+ 

ように見えた場合、私は今日の日付を必要とする5

+----+-------------+ 
|id |created_at | 
+----+-------------+ 
|9 |1 day ago | 
|8 |2 days ago | 
|7 |3 days ago | 
|6 |4 days ago | 
|5 |5 days ago | < not this date 
|4 |6 days ago | < get this date 
|3 |12 days ago | < not this date 
|2 |13 days ago | < not this date 
|1 |20 days ago | 
+----+-------------+ 

この表を与えられ、N =

+0

は 'created_at '日付か文字通り「11日前」? – WillardSolutions

+0

それは日付です、私はちょうどX日前に例で読むのが簡単だと分かりました – Jarfis

+0

日付が1,2,5,6,7,15日前の場合は、15日前に間違いがあります。 N日より? – Barmar

答えて

1

隣接する日付間のギャップを計算するクエリから開始します。

SELECT created_at, DATEDIFF(@prevdate, created_at) AS diff, @prevdate := created_at 
FROM (SELECT created_at 
     FROM yourTable 
     WHERE created_at <= DATE_SUB(CURDATE(), INTERVAL @N DAY) 
     ORDER BY created_at DESC) AS x, 
CROSS JOIN (SELECT @prevdate := NULL) as vars 

はその後diff以上Nある行のフィルタを追加し、最新の日付がよりN日である場合、現在の日付を取得するには、最後にこれらの

SELECT MAX(created_at) AS selected_date 
FROM (SELECT created_at, DATEDIFF(@prevdate, created_at) AS diff, @prevdate := created_at 
     FROM (SELECT created_at 
      FROM yourTable 
      WHERE created_at <= DATE_SUB(CURDATE(), INTERVAL @N DAY) 
      ORDER BY created_at DESC) AS x 
     CROSS JOIN (SELECT @prevdate := NULL) as vars) AS z 
WHERE diff > @N; 

の最新を選択します以前は、最新の日付を取得する別のクエリに参加し、IF()を使用することができます。

SELECT IF (latest_date < DATE_SUB(CURDATE(), INTERVAL @N DAY), CURDATE(), MAX(created_at)) AS selected_date 
FROM (SELECT created_at, DATEDIFF(@prevdate, created_at) AS diff, @prevdate := created_at 
    FROM (SELECT created_at 
      FROM yourTable 
      WHERE created_at <= DATE_SUB(CURDATE(), INTERVAL @N DAY) 
      ORDER BY created_at DESC) AS x 
    CROSS JOIN (SELECT @prevdate := NULL) as vars) AS z 
CROSS JOIN (SELECT MAX(created_at) AS latest_date FROM yourTable) AS y 
WHERE diff > @N; 

DEMO

+0

これは私が探しているとは思わない、それはちょうどN日以上の最新のレコードよりも新しい最初のレコードのcreated_atを返していないでしょうか? – Jarfis

+1

あなたが求めていたのはそれでしたが、投稿してから質問を変更したようです。 – Barmar

+0

申し訳ありませんが、私の最初のパスは十分に詳細ではありませんでした – Jarfis

0

私は

SELECT IF (latest_date < DATE_SUB(CURDATE(), INTERVAL @N DAY), CURDATE(), MAX(fetch_prevdate)) AS selected_date 
FROM (SELECT created_at, @prevdate as fetch_prevdate, DATEDIFF(@prevdate, created_at) AS diff, @prevdate := created_at 
     FROM (SELECT created_at 
      FROM yourTable 
      WHERE created_at <= DATE_SUB(CURDATE(), INTERVAL @N DAY) 
      ORDER BY created_at DESC) AS x 
     CROSS JOIN (SELECT @prevdate := NULL) as vars) AS z 
CROSS JOIN (SELECT MAX(created_at) AS latest_date FROM yourTable) AS y 
WHERE diff > @N; 

Barmarの答えは私が必要なものの99パーセントのようだったが、私は前に@prevdate値を格納するために、日付の差サブクエリにフィールドを追加しなければならなかったと一緒に行きましたそれは選択でさらに割り当てられ、created_atフィールドの代わりにMAXフィールドを取得しました

関連する問題