Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL:无法使用子查询中的父查询中的datediff或date_add引用筛选行_Mysql_Sql_Mariadb - Fatal编程技术网

Mysql SQL:无法使用子查询中的父查询中的datediff或date_add引用筛选行

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

我正在尝试匹配记录状态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 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
);