Mysql SQL:无法使用子查询中的父查询中的datediff或date_add引用筛选行
我正在尝试匹配记录状态id标志在90多天内从2更改为1的数据。查询应忽略从1更改为2的记录。我得到了他们的帮助和资源。 我有以下数据集:Mysql SQL:无法使用子查询中的父查询中的datediff或date_add引用筛选行,mysql,sql,mariadb,Mysql,Sql,Mariadb,我正在尝试匹配记录状态id标志在90多天内从2更改为1的数据。查询应忽略从1更改为2的记录。我得到了他们的帮助和资源。 我有以下数据集: revision record_id record_status_id last_updated_date 239 59 1 2016-01-19 10:18:00 284 59 2 2016-01-19 12:12:00 302 59 2 2016-01-20 15:18:00 304 59 2 2016-01-25
revision record_id record_status_id last_updated_date
239 59 1 2016-01-19 10:18:00
284 59 2 2016-01-19 12:12:00
302 59 2 2016-01-20 15:18:00
304 59 2 2016-01-25 16:26:00
305 59 1 2016-05-24 16:29:00
307 59 2 2016-05-25 11:33:00
309 59 1 2016-07-07 10:15:00
310 59 2 2016-08-07 12:44:00
489 59 1 2016-11-11 02:12:00
492 59 1 2016-11-11 05:25:00
502 59 2 2016-11-12 10:12:00
504 59 2 2016-12-05 11:23:00
509 59 1 2016-12-11 12:24:00
519 59 1 2016-12-11 14:30:00
524 59 1 2016-12-11 15:36:00
674 59 1 2016-12-11 17:45:00
模式和数据:
CREATE TABLE IF NOT EXISTS record_history (
`revision` INT(11) NOT NULL,
`record_id` BIGINT(20) NOT NULL,
`creation_date` DATETIME NULL DEFAULT NULL,
`record_status_id` BIGINT(20) NULL DEFAULT NULL,
`last_updated_date` DATETIME NULL DEFAULT NULL,
PRIMARY KEY USING BTREE (`record_id`, `revision`))
ENGINE = InnoDB;
INSERT INTO record_history(revision,record_id,creation_date,record_status_id,last_updated_date) VALUES
( 239,59,'2016-01-18 16:23:00',1,'2016-01-19 10:18:00'),
( 284,59,'2016-01-18 16:23:00',2,'2016-01-19 12:12:00'),
( 302,59,'2016-01-18 16:23:00',2,'2016-01-20 15:18:00'),
( 304,59,'2016-01-18 16:23:00',2,'2016-01-25 16:26:00'),
( 305,59,'2016-01-18 16:23:00',1,'2016-05-24 16:29:00'),
( 307,59,'2016-01-18 16:23:00',2,'2016-05-25 11:33:00'),
( 309,59,'2016-01-18 16:23:00',1,'2016-07-07 10:15:00'),
( 310,59,'2016-01-18 16:23:00',2,'2016-08-07 12:44:00'),
( 489,59,'2016-01-18 16:23:00',1,'2016-11-11 02:12:00'),
( 492,59,'2016-01-18 16:23:00',1,'2016-11-11 05:25:00'),
( 502,59,'2016-01-18 16:23:00',2,'2016-11-12 10:12:00'),
( 504,59,'2016-01-18 16:23:00',2,'2016-12-05 11:23:00'),
( 509,59,'2016-01-18 16:23:00',1,'2016-12-11 12:24:00'),
( 519,59,'2016-01-18 16:23:00',1,'2016-12-11 14:30:00'),
( 524,59,'2016-01-18 16:23:00',1,'2016-12-11 15:36:00'),
( 674,59,'2016-01-18 16:23:00',1,'2016-12-11 17:45:00');
到目前为止,我使用了以下查询:
SELECT revision, record_id, record_status_id, last_updated_date FROM record_history AS a
WHERE a.record_status_id = 2
and a.record_status_id <> ( SELECT b.record_status_id FROM record_history AS b
WHERE a.record_id = b.record_id
AND a.last_updated_date < b.last_updated_date
-- AND DATEDIFF(b.last_updated_date, a.last_updated_date) > 90
-- and b.last_updated_date > DATE_ADD(a.last_updated_date,INTERVAL 90 DAY)
LIMIT 1
);
接下来,我想过滤记录的日期差(记录状态标识从2变为1)大于90的记录。
我已经评论了DATEDIFF和DATE_ADD,因为它似乎不起作用。理想情况下,它应该对我有用,但它不是。我的预期结果如下所示,因为修订304和305的标志在90天后从2变为1,因此修订310的情况也是如此
revision record_id record_status_id last_updated_date
304 59 2 2016-01-25 16:26:00
310 59 2 2016-08-07 12:44:00
谢谢你的努力。我不知道是什么导致了DATEDIFF和DATE_ADD的不稳定行为。如果我取消注释这些关键字行,过滤的记录将扩展而不是缩小到所需的结果。我在中创建了示例数据以及我使用的查询。在的帮助下,我能够解决我的问题。以下是我的解决方案:
SELECT revision, record_id, record_status_id, last_updated_date FROM record_history AS a
WHERE a.record_status_id = 2
and a.record_status_id <> ( SELECT T.record_status_id FROM record_history AS T
WHERE a.record_id = T.record_id
AND a.last_updated_date < T.last_updated_date
LIMIT 1
)
and a.revision in (
SELECT T.revision
-- SELECT T.revision, T.record_id, T.record_status_id, T.last_updated_date, DATEDIFF(T.NextDate, T.last_updated_date) as days
FROM (SELECT T1.revision, T1.record_id, T1.record_status_id, T1.last_updated_date,
( SELECT T2.last_updated_date
FROM record_history T2
WHERE T2.record_id = T1.record_id
AND T2.last_updated_date > T1.last_updated_date limit 1
) AS NextDate
FROM record_history T1
) AS T
WHERE DATEDIFF(T.NextDate, T.last_updated_date) > 90
);
希望这对其他用户有用。请参阅“确定”,谢谢。我将使用sqlfiddle或rextester中建议的格式化日期时间戳进行更新。列的数据类型是什么?仅获取DATEDIFF时,您会得到什么值?显示3列-2个日期和不稳定的datediff。“last_updated_time”的类型为DATETIME。我在子查询中使用了DATEDIFF,该子查询当前在该问题查询块中被注释,因此我无法将其拉到父查询结果。。parenta.last_updated_date和subqueryb中有两个datetime列。last_updated_date和datediff用于子查询DATEDIFFb.last_updated_date,a.last_updated_date>90。我已经在问题和rextester中编辑/发布了模式以及插入数据。
SELECT revision, record_id, record_status_id, last_updated_date FROM record_history AS a
WHERE a.record_status_id = 2
and a.record_status_id <> ( SELECT T.record_status_id FROM record_history AS T
WHERE a.record_id = T.record_id
AND a.last_updated_date < T.last_updated_date
LIMIT 1
)
and a.revision in (
SELECT T.revision
-- SELECT T.revision, T.record_id, T.record_status_id, T.last_updated_date, DATEDIFF(T.NextDate, T.last_updated_date) as days
FROM (SELECT T1.revision, T1.record_id, T1.record_status_id, T1.last_updated_date,
( SELECT T2.last_updated_date
FROM record_history T2
WHERE T2.record_id = T1.record_id
AND T2.last_updated_date > T1.last_updated_date limit 1
) AS NextDate
FROM record_history T1
) AS T
WHERE DATEDIFF(T.NextDate, T.last_updated_date) > 90
);