Mysql 从几天后状态仍然相同的表中获取这些行?

Mysql 从几天后状态仍然相同的表中获取这些行?,mysql,Mysql,我得到了一个MySql表,有3列status、mail和created_at。现在,我想得到那些status='somestatus'的行,其中的状态仍然是'some_status',例如3天后。应通过专栏邮件进行选择 因此,如果3天后在created_at中的同一邮件具有相同的状态“somestatus”,我想选择该数据。创建的列包含2016-08-01 14:13:27格式的数据 如果这更容易获取:我需要同一封邮件的所有行,其中状态为并且仍然为“somestatus”。一旦状态为“somes

我得到了一个MySql表,有3列status、mail和created_at。现在,我想得到那些status='somestatus'的行,其中的状态仍然是'some_status',例如3天后。应通过专栏邮件进行选择

因此,如果3天后在created_at中的同一邮件具有相同的状态“somestatus”,我想选择该数据。创建的列包含2016-08-01 14:13:27格式的数据

如果这更容易获取:我需要同一封邮件的所有行,其中状态为并且仍然为“somestatus”。一旦状态为“somestatus”并随后更改为“somestatus”以外的任何状态,我就不需要该数据。更简单?

您必须使用DATEDIFF函数,该函数以天为单位返回两个日期之间的差值,如下所示:

SELECT 
a.Id,
a.Client_id,
a.Name,
a.date
FROM 
(
SELECT 
  Id as Id,
  Client_Id as Client_Id,
  Name as Name,
  Value as Value,
  date as date,
  row_number() over (Partition by client_id,name,value order by id) as row_num
FROM <your_table>) a
WHERE a.row_num = 1;
SELECT status, mail, created_at
FROM tbl
WHERE status = 'somestatus' AND DATEDIFF(NOW(), created_at) = 3
检查@startDate之间的DATEDIFF记录将此设置为任意值,然后再设置+3天

SET @startDate = '2019-11-23';
SELECT status, mail, created_at FROM table
WHERE status = 'somestatus' AND
MAIL = 'some value' AND
DATEDIFF(@startDate, (@startDate + INTERVAL 3 DAY)) = -3
更新后的问题,这应该做的把戏

在where中选中子查询。检查所有有不同价值的邮件,然后不付款


是否要检索在3天内未更改其状态的所有行?我建议使用第二列status\u changed\u at,其中包含上次修改状态的时间信息。您需要将其与status一起更新。我无法添加任何列。根据created_at,我只需要3天后状态仍然相同的列邮件行。所有这些记录是否都已可用,例如2016-08-01、2016-08-02、2016-08-03、2016-08-04。或者这是将来的事,所以今天+3天这些日期都已经在表中了,我只需要以某种方式选择它们。@Arnie如果不记录上次状态更改日期/更新历史记录,你就无法真正做到这一点。看起来不错,但我想不起作用,这是因为现在。它应该总是比较created_at和created_at。例如DATEDIFFcreated_at,created_at=3尝试解释您在解决方案中所做的工作,这将对其他用户更有帮助,而不仅仅是代码回答谢谢,但这里我必须手动设置startdate,我不能,因为它是动态的。有没有一种方法可以动态地设置它以获得期望的结果?你说我必须动态地获得起始日期是什么意思?早些时候你说所有日期都是过去的,所以从现在到那时没有腐蚀是的,所有日期都已经在数据库中了,每个日期都在单独的一行中。但我需要它在不设置开始日期的情况下工作。如下所示:返回邮件相同的所有行,状态为somestatus,并且已创建的\u至少距离上次为同一邮件创建的\u至少3天。邮件始终是相同唯一id的3条记录,或者沿着这些行。每个唯一邮件最多有3条记录?@Arnie如果您能在表中显示一些数据,将大大提高我们帮助您的能力
SELECT status, mail, created_at
FROM test
WHERE mail NOT IN
(
SELECT mail
FROM `test`
where status != 'notpayed'
)