3

我有一个包含许多记录的带有 MySQL 数据库的 PHP 程序。特别相关的两列是事件编号和日期。这两者都只会向前发展。然而,有时用户输入的数据是乱序的;例如:

Incident Date
1        Jan 1 2000
2        Jan 1 2010
3        Jan 1 2002

看来事件 2 输入的日期错误,应该是 2001 年 1 月 1 日。

有没有办法查询日期乱序的记录?或者我是否必须遍历所有跟踪最后日期的记录才能找到错误?

补充说明:事件不是连续的(它们可能是 1、3、6、123 等)。日期也不是连续的。这些是同一张表中的列。

4

4 回答 4

7

此命令选择同一表中存在事件编号较低但日期较高的记录的任何记录。

 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 的副本)。

于 2012-09-27T18:58:38.870 回答
1
select * from yourtable t1
     inner join yourtable t2
     on t1.incident=t2.incident-1
     and t1.date>t2.date
于 2012-09-27T18:58:14.857 回答
1

这将选择日期大于下一个记录日期的所有 id。这应该告诉你哪些是不正常的。

SELECT Incident FROM table a 
    WHERE a.Date > (SELECT b.Date FROM table b WHERE b.Incident = (a.Incident + 1))
于 2012-09-27T18:58:33.433 回答
0

如果 IncidentID 列始终处于常规增量序列中:

SELECT c.IncidentID AS cincID, p.IncidentID AS pincID, 
c.Date AS cDate, p.Date AS pDate,
DATEDIFF(c.Date, p.Date)
FROM Incident c, Incident p
WHERE c.IncidentID = (p.IncidentID + 1)
AND datediff(c.Date, p.Date) < 1
于 2012-09-27T19:18:58.783 回答