Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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查询以查找无序记录_Mysql_Sql_Select_Sequence - Fatal编程技术网

Mysql SQL查询以查找无序记录

Mysql SQL查询以查找无序记录,mysql,sql,select,sequence,Mysql,Sql,Select,Sequence,我有一个PHP程序w/MySQL数据库,其中包含许多记录。两列特别相关的是incidentnumber和date。这两者都只是向前推进。然而,有时用户输入的数据是无序的;例如: Incident Date 1 Jan 1 2000 2 Jan 1 2010 3 Jan 1 2002 事件2似乎输入了错误的日期,应该是2001年1月1日 有没有办法查询日期顺序不正确的记录?或者我必须遍历跟踪最后一个日期的所有记录才能找到错误 补充说明:事件不是连续发生的

我有一个PHP程序w/MySQL数据库,其中包含许多记录。两列特别相关的是incidentnumber和date。这两者都只是向前推进。然而,有时用户输入的数据是无序的;例如:

Incident Date
1        Jan 1 2000
2        Jan 1 2010
3        Jan 1 2002
事件2似乎输入了错误的日期,应该是2001年1月1日

有没有办法查询日期顺序不正确的记录?或者我必须遍历跟踪最后一个日期的所有记录才能找到错误


补充说明:事件不是连续发生的,它们可能发生在1、3、6123等,日期也不是连续发生的。这些是同一个表中的列。

这将选择日期大于下一个记录日期的所有ID。这会告诉你哪些是坏的

select * from yourtable t1
     inner join yourtable t2
     on t1.incident=t2.incident-1
     and t1.date>t2.date
SELECT Incident FROM table a 
    WHERE a.Date > (SELECT b.Date FROM table b WHERE b.Incident = (a.Incident + 1))

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

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

如果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

不过,这可能会产生大量记录。例如,如果最后两条记录错误地出现在1900年,那么该查询将给出每一条日期正确的记录。在这种情况下,它将只给出最后两条记录,所有其他记录的事件编号都不低,日期也不高。然而,在相反的情况下,一个低事件数和一个很晚的日期将产生你所描述的情况。你是对的,我有一个倒退。不管怎样,问题是存在的;所以我不认为这是一个找到无序记录的好方法。这在很大程度上取决于你对无序的定义。如果第一条记录在文件中所有其他记录之后,那么从技术上讲,所有其他记录都是无序的。据推测,其目的是此命令永远不应返回任何记录,如果返回,则会有人调查并更正错误。但是,请参见我的编辑。Re:大概,其目的是此命令不应返回任何记录,如果返回,则会有人调查并更正错误:啊。我假设其目的是,该命令永远不会像您所说的那样返回任何记录,并且当它确实返回记录时,它包含必要的信息,以便查看和修复错误,而不是要求另一个人调查步骤+1,但请注意,这将忽略事件5之后发生事件3,事件4已被删除的情况。mysql是否具有窗口功能?事件数是否始终以常规增量顺序递增1或是否存在iRegularity?@wildplasser:否。mysql的SQL功能停留在90年代后期@一匹没有名字的马:正如你可能已经得出的结论,创建两个平行的秩或行号是显而易见的解决方案:其中rnk1 rnk2将完成其余的工作。顺便说一句:关于一次考试,有一个很好的EWD趣闻,在这个考试中,接触过FORTRAN的考生没有看到基于双索引x=a[a[y]]的解决方案;或者这样:-顺便说一句:我也可以用CTE做排名。对不起,我一定是误读了这个问题。我有罪。我将删除我先前的评论。因此,+1;但请注意,这将忽略以下情况:例如,事件3发生在事件5之后,而事件4已被删除。