私は、構造化された方法でフォーマットされた電子メールを受信して解析し、情報を MySQL データベースに保存するシステムに取り組んでいます。各電子メールには、特定のイベントが記載されています。ただし、イベントの詳細がディスパッチャによって更新されると新しい電子メールが送信されるため、1 つのイベントで複数の電子メールが生成されることがあります。これは、新しい情報が追加されると、数分間の間に何度も発生する可能性があります。
特定のイベントを説明する最新の行のみを選択するクエリを作成しようとしています。
以下は、テーブルがどのように見えるかの例です。とは同じイベントを参照してEventID
いることに注意してください。イベントは、最近受信したメールに詳細が記載されているだけです。人間は、アドレス、イベント タイプ、および受信時刻をすばやく見て、それらが同じイベントを参照していると推測できます。問題は、これを妥当な精度でクエリに変換するにはどうすればよいかということです。3
4
4
EventID EventReceived EventAddress EventType EventDetails
4 11-15-2012 22:55 1234 Anywhere Ln Fall In backyard. Possible fracture.
3 11-15-2012 22:54 1234 Anywhere Ln Fall In backyard.
2 11-15-2012 17:04 4321 Freedom Ct Heart Attack Short of breath. Took 2 NTG.
1 11-15-2012 13:43 9871 Main St Traffic Crash 2 vehicles in intersection. Fluid leaking from vehicle.
データベースにクエリを実行するときに受け取りたいのは次のとおりです。
EventID EventReceived EventAddress EventType EventDetails
4 11-15-2012 22:55 1234 Anywhere Ln Fall In backyard. Possible fracture.
2 11-15-2012 17:04 4321 Freedom Ct Heart Attack Short of breath. Took 2 NTG.
1 11-15-2012 13:43 9871 Main St Traffic Crash 2 vehicles in intersection. Fluid leaking from vehicle.
最初に、私はこれを試しました:
SELECT * FROM table_name WHERE (EventID) IN (SELECT MAX(EventID) FROM table_name GROUP BY EventAddress) ORDER BY EventReceived DESC;
少なくとも 2 つの問題がありますが、一般的には機能しているようです。
- クエリは数百のレコードでも非常に遅い (~15 秒)
- が同じイベントを見逃していると思い
EventAddress
ますが、イベントは、たとえば数日離れています。これらは明らかに同じイベントではありませんが、グループ化されたアドレス内で最も高いものだけを取得しているため、ロールアップされる可能性がEventID
あります。
そう:
- クエリの効率を改善するにはどうすればよいですか。
- 時間要素の重要性をどのように説明できますか? (同じイベントと見なすべきものに任意の時間制限を課すことができます。たとえば、15 分)。
SQL クエリに依存するのではなく、このロジックをアプリケーションに組み込むことをお勧めしますか?
ここまでやってくれて、役に立つアイデアを持っている人に感謝します!
注:参考になるかもしれないと思ってこの質問を見てみましたが、時間がまったく同じではないため、うまくいくかどうかわかりません。