我有一个带有 MySQL 数据库的 PHP 程序,其中包含许多记录。特别相关的两列是事件编号和日期。这些都只向前移动。然而,有时用户输入的数据是乱序的;例如:
Incident Date
1 Jan 1 2000
2 Jan 1 2010
3 Jan 1 2002
事件 2 似乎输入了错误的日期,应该是 2001 年 1 月 1 日。
有什么方法可以查询日期乱序的记录吗?还是我必须遍历所有跟踪最后日期的记录才能找到错误?
添加注意:事件不是连续的(它们可能是 1、3、6、123 等)。日期也不是连续的。这些是同一个表中的列。
最佳答案
此命令选择在同一表中存在事件编号较低但日期较高的记录的任何记录。
SELECT * FROM TableName T1 WHERE EXISTS
(SELECT * FROM TableName T2
WHERE T2.Incident < T1.Incident AND T2.Date > T1.Date)
这个稍微复杂一些的命令将只查找“双向”乱序的记录,这意味着它们在文件的前面有一个日期较晚的记录,在文件的后面有一个日期较早的记录。这避免了文件中很早的记录出错会导致所有后续记录出现乱序的情况。但是,它不会在事件编号最低或最高的两条记录中发现问题。
SELECT * FROM TableName T1 WHERE EXISTS
(SELECT * FROM TableName T2
WHERE T2.Incident < T1.Incident AND T2.Date > T1.Date)
AND EXISTS
(SELECT * FROM TableName T2
WHERE T2.Incident > T1.Incident AND T2.Date < T1.Date)
最后,正如 ruakh 在评论中指出的那样,上面的查询为您提供了所有无序记录。尽管从技术上讲,这就是您想要的,但很难在日期链中找到“破损点”。以下查询将只为您提供链条困惑的记录,不需要 IncidentID 单调增加,并允许删除事件。
SELECT * FROM TableName T1 WHERE
Date < (SELECT Date FROM TableName T2 WHERE T2.IncidentID =
(SELECT MAX(IncidentID) FROM TableName T3 WHERE T3.IncidentID < T1.IncidentID))
OR Date > (SELECT Date FROM TableName T2 WHERE T2.IncidentID =
(SELECT MAX(IncidentID) FROM TableName T3 WHERE T3.IncidentID > T1.IncidentID))
(未测试,因为我手头没有 MySQL 副本)。
关于mysql - SQL 查询以找出订单记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12628282/