如何在 MySQL 中查找共享相同(未知)前缀的字符串组?
How to find groups of strings in MySQL that share the same (unkown) prefixes?
我在我的论坛中寻找垃圾邮件发送者,并注意到垃圾邮件发送者经常会按照以下模式使用来自 Yahoo 或 Gmail 的电子邮件地址:
abcde*******01@gmail.com
abcde*******02@gmail.com
abcde*******03@gmail.com
他们会接受一串相同的字符,然后是随机的乱码。通常,但并非总是如此,他们会以随机数字结尾。
为了找到这些,我想找出与至少两个其他帐户共享相同前五个字符的所有用户电子邮件地址。我在删除之前手动检查这些,所以不太担心偶尔出现的误报。
这五个字符是随机的,我事先不知道它们,只是它们在多个帐户电子邮件中共享。
如何在 MySQL 中执行此操作?
我猜我只需要从地址中切出前五个字符,然后 GROUP BY
这个切片的计数 > 2。
但我不知道正确的 MySQL 语法是什么。我怀疑它可以在没有正则表达式的情况下编写,尽管如有必要,我正在使用 MariaDB 10,它提供了几个方便的基于正则表达式的 SQL 函数。
试试 MySQL SUBSTRING 函数:
select SUBSTRING(email,1,5),count(*) from users group by 1 having count(*)>2
SELECT SUBSTR(email, 1, 5) AS prefix FROM log
GROUP BY prefix
HAVING COUNT(DISTINCT email) > 2
不过我感觉它会很慢。 :)
编辑:这将在 table 中起作用,其中同一电子邮件地址可能多次出现,例如访问日志。如果所有的电子邮件都是不同的,matthewh 的解决方案也可以。
我在我的论坛中寻找垃圾邮件发送者,并注意到垃圾邮件发送者经常会按照以下模式使用来自 Yahoo 或 Gmail 的电子邮件地址:
abcde*******01@gmail.com
abcde*******02@gmail.com
abcde*******03@gmail.com
他们会接受一串相同的字符,然后是随机的乱码。通常,但并非总是如此,他们会以随机数字结尾。
为了找到这些,我想找出与至少两个其他帐户共享相同前五个字符的所有用户电子邮件地址。我在删除之前手动检查这些,所以不太担心偶尔出现的误报。
这五个字符是随机的,我事先不知道它们,只是它们在多个帐户电子邮件中共享。
如何在 MySQL 中执行此操作?
我猜我只需要从地址中切出前五个字符,然后 GROUP BY
这个切片的计数 > 2。
但我不知道正确的 MySQL 语法是什么。我怀疑它可以在没有正则表达式的情况下编写,尽管如有必要,我正在使用 MariaDB 10,它提供了几个方便的基于正则表达式的 SQL 函数。
试试 MySQL SUBSTRING 函数:
select SUBSTRING(email,1,5),count(*) from users group by 1 having count(*)>2
SELECT SUBSTR(email, 1, 5) AS prefix FROM log
GROUP BY prefix
HAVING COUNT(DISTINCT email) > 2
不过我感觉它会很慢。 :)
编辑:这将在 table 中起作用,其中同一电子邮件地址可能多次出现,例如访问日志。如果所有的电子邮件都是不同的,matthewh 的解决方案也可以。