mysql - 如何使用 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 封,理想情况下,查询将包括这些电子邮件,尽管我意识到这可能会变得复杂,例如,如果有许多相同的电子邮件每隔一小时连续发送一秒钟。
解决方案
这只是一个如何实现你想要的例子。但这是非常昂贵的查询。如果您有一张巨大的桌子 - 这将变得非常慢。为了提高性能,我建议创建另一列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;
推荐阅读
- mongodb - 如何使用 pymongo 将整个 MongoDB 数据库导出到 .csv 文件?
- firebase - 使用 curl 创建时 Firebase 动态链接内部错误
- javascript - CAML 输出从 DateTime 中删除时间
- react-dates - 主题反应日期不起作用
- python - 如何更改 Matplotlib 表的透明度/不透明度?
- validation - 这个公式和纯度公式验证一样吗?
- apache-spark - 如何注册自定义 Spark 结构化流媒体源
- swift - Swift SKPhysics 节点无阻力飞行
- excel - Excel - 索引公式不抓取数据
- go - golang 可以在 C++ 中做类似#define 的事情吗?