3

多くのレコードを含むMySQLデータベースを備えたPHPプログラムがあります。特に関連性のある2つの列は、インシデント番号と日付です。これらは両方とも前進するだけです。ただし、ユーザーが順序が正しくないデータを入力する場合があります。例えば:

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)

この少し複雑なコマンドは、「両方向」で順序が乱れているレコードのみを検索します。つまり、ファイルの早い方に日付の古いレコードがあり、ファイルの後ろに古い日付のレコードがあります。これにより、ファイル内の非常に初期のレコードでミスをすると、後続のすべてのレコードが順不同に見えるという状況が回避されます。ただし、インシデント番号が最小または最大の 2 つのレコードでは、問題は検出されません。

 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 に答える