首页 > 解决方案 > 如何使用 SQL 选择特定字段的重复行,允许时差?

问题描述

我在 MySQL 数据库中记录发送电子邮件,我想查找同时发送的重复电子邮件。

此查询成功地查找同时发送的电子邮件:

SELECT user_id, template, created_at, COUNT(*)
FROM emails
WHERE sender_id = 08347
GROUP BY user_id, template, created_at
HAVING COUNT(*) > 1;

但是,如果我想留出时间余量,比如created_at+/- 5 秒,我不确定如何在GROUP BY.

如何选择允许时差的重复电子邮件?

编辑:

大约在同一时间发送的电子邮件可能超过 2 封,理想情况下,查询将包括这些电子邮件,尽管我意识到这可能会变得复杂,例如,如果有许多相同的电子邮件每隔一小时连续发送一秒钟。

标签: mysqlsql

解决方案


这只是一个如何实现你想要的例子。但这是非常昂贵的查询。如果您有一张巨大的桌子 - 这将变得非常慢。为了提高性能,我建议创建另一列10_sec_period并在每次插入时使用一些触发器对其进行更新。最重要的是,这个新列需要添加到某个索引中。

SELECT user_id, 
       template,
       SEC_TO_TIME((TIME_TO_SEC(created_at) DIV 60) * 60) AS 10_sec_period, 
       COUNT(*)
FROM emails
WHERE sender_id = 08347
GROUP BY user_id, template, 10_sec_period
HAVING COUNT(*) > 1;

推荐阅读