我想做一种黑名单,以便存储在数据库中
id|value
-----------
1|test.com
2|example@
3|@another.
...
现在,我正在寻找最快的方法来检查给定的字符串(例如,电子邮件地址)是否与数据库中的部分值匹配。
例如 my@mail.com->数据库中没有结果->没有垃圾邮件 example@mail.com->与ID2匹配->垃圾邮件 ...
内部人员,MySQL语句有没有办法做到?
目前,我仅看到一种将所有值加载到数组中的方法,请对此进行检查,但是这种方法需要大量资源,而且速度很慢。
非常感谢。
答案 0 :(得分:2)
像这样使用查询:
SELECT * FROM `table_name` WHERE `value` LIKE '%emailadress%';
答案 1 :(得分:0)
仅在MySQL中可以进行完整处理。
请注意,这将不在较大的表上扩展,因为无法使用索引,因此请记住这一点。
查询
SELECT
*
FROM (
SELECT
'test' COLLATE 'utf8mb4_general_ci' AS word
UNION ALL
SELECT
'example' COLLATE 'utf8mb4_general_ci' AS word
# When you need more words
# UNION AL
# SELECT 'another' COLLATE 'utf8mb4_general_ci' AS word
#
) AS check_list
INNER JOIN
blacklist
ON
blacklist.`value` LIKE CONCAT('%', check_list.word ,'%')
# note COLLATE 'utf8mb4_general_ci' might not even be needed to the used server
# because it's depending on server config and used table charsets/collates
结果
| word | id | value |
| ------- | --- | -------- |
| test | 1 | test.com |
| example | 2 | example@ |
或者对于可以在较大表上扩展的最佳版本,您必须使用FULLTEXT索引和MATCH()
查询
SELECT
*
FROM
blacklist
WHERE
MATCH (blacklist.`value`)
AGAINST (
(
'test example'
)
IN BOOLEAN MODE
)
请参见demo
答案 2 :(得分:0)
不仅仅是检查LOCATE()
来查看字符串是否在以字符串形式提供的给定电子邮件地址内?
SELECT
COUNT(*)
FROM
blacklist
WHERE
LOCATE(value, 'my@mail.com');
+----------+
| COUNT(*) |
+----------+
| 0 |
+----------+
SELECT
COUNT(*)
FROM
blacklist
WHERE
LOCATE(value, 'example@mail.com');
+----------+
| COUNT(*) |
+----------+
| 1 |
+----------+
请参见DB Fiddle demo。