我正在使用一个系统来接收和解析以结构化方式格式化的电子邮件并将信息保存到MySQL数据库。每封电子邮件描述一个特定事件。但是,有时单个事件可以生成多封电子邮件,因为在调度程序更新事件详细信息时会发送新的电子邮件。随着新信息的添加,这可能会在几分钟内多次发生。
我正在尝试编写一个查询,该查询将仅选择描述给定事件的最新行。
下面是表格的外观示例。请注意,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;
通常,它似乎起作用,尽管至少存在两个问题:
查询非常慢,即使有几百条记录(〜15秒)
我怀疑我错过了
EventAddress
相同的事件,但是这些事件相隔几天。这些显然不是同一件事,但可能会汇总,因为我只是在分组地址中获取最高的EventID
。所以:
我如何提高查询效率,以及
如何解释时间因素的重要性? (我可以对应该视为同一事件的事件施加一些任意的时间限制;例如15分钟)。
建议将此逻辑放在我的应用程序中,而不要依赖SQL查询吗?
感谢所有到目前为止取得成功并提出任何可能有用的想法的人!
注意:我看了this question,认为它可能会有所帮助,但是我不确定是否可以使它工作,因为时间可能并不完全相同。
最佳答案
一种可能的优化解决方案是运行一个频繁的过程以删除重复项。
例如:每10分钟运行一个脚本,以浏览过去10-11分钟内的所有记录,识别重复项并删除它们。
脚本执行的频率及其运行的时间最好由系统要求决定。
关于mysql - 根据多个字段的比较清除重复项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13410381/