2016-11-21 134 views
0

我不知道这是否可能,但这里是我正在寻找的Mysql - 在记录之前N天创建的最近记录

我需要当前日期,如果创建的最后一条记录超过N天或创建的第一条记录的created_at日期之后N天内创建的第一条记录的created_at

因此,如果存在两条记录,其创建日期为差异大于N天,并且在这两个日期之间不会创建其他记录,请为我提供最近创建的这些记录的created_at,除非最近的created_at中的所有记录都大于N天前,在这种情况下,请提供今天的da TE代替

所以对于这个表和N = 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 | 
+----+-------------+ 

我需要得到6 days ago但不13 days ago5 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 | 
+----+-------------+ 

我需要今天的日期

+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的过滤器,并选择最近的这些

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; 

最后,为了获得当前的日期,如果最近的日期超过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的回答是一样的,我需要什么,但我有一个字段添加到的时间差子查询之前存储@prevdate值99%它被重新分配在select中并且得到MAX而不是created_at字段