TSG*_*TSG 3 mysql sql select sequence
我有一个PHP程序w/MySQL数据库,其中包含许多记录.特别相关的两列是事件编号和日期.这些都只是前进.但是,有时用户输入的数据不按顺序; 例如:
Incident Date
1 Jan 1 2000
2 Jan 1 2010
3 Jan 1 2002
Run Code Online (Sandbox Code Playgroud)
事件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)
Run Code Online (Sandbox Code Playgroud)
这个稍微复杂一点的命令只能找到"双向"中无序的记录,这意味着它们在文件的前面有一个较晚的记录,而在文件的后面有一个较早的记录.这避免了在文件中的早期记录中出错将使所有后续记录无序出现的情况.但是,它不会在事件编号最低或最高的两个记录中发现问题.
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)
Run Code Online (Sandbox Code Playgroud)
最后,正如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))
Run Code Online (Sandbox Code Playgroud)
(未经测试,因为我没有方便的MySQL副本).
| 归档时间: |
|
| 查看次数: |
2912 次 |
| 最近记录: |