我正在开发一个系统,该系统接收和解析以结构化方式格式化的电子邮件,并将信息保存到MySQL数据库。每封电子邮件描述特定事件。但是,有时单个事件可以生成多个电子邮件,因为在调度程序更新事件详细信息时会发送新电子邮件。随着新信息的添加,这可能会在几分钟内多次发生。
我正在尝试编写一个只选择描述给定事件的最新行的查询。
下面是表格的示例。请注意,EventID
的{{1}}和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;
相同的事件,但事件相隔几天。这些显然不是同一个事件,但可能会卷起来,因为我只抓取分组地址中的最高EventAddress
。所以:
将此逻辑放在我的应用程序中而不是依赖于SQL查询是否明智?
感谢任何能够做到这一点的人,并且有任何可能有用的想法!
注意:我看了this question,认为它可能会有所帮助,但我不确定我是否可以使它工作,因为时间不会完全相同。
答案 0 :(得分:0)
一种可能的优化解决方案是运行频繁的过程来删除重复项。
例如:每10分钟运行一次脚本,浏览过去10-11分钟内的所有记录,找出重复项并删除它们。
脚本执行的频率及其工作的时间段最好由您的系统要求决定。
答案 1 :(得分:0)
您可以尝试这样的事情:
SELECT t1.*
FROM table_name t1
LEFT JOIN table_name t2 ON t2.EventAddress = t1.EventAddress AND t2.EventReceived > t1.EventReceived
WHERE t2.EventID IS NULL
我目前无法测试语法,但我们的想法是针对最新的相同事件自行加入表,并且只保留没有更新条目的事件。