Php 如何检查MySQL字符串是否与数据库中的部分匹配?
我想做一种黑名单,所以我存储在我的数据库Php 如何检查MySQL字符串是否与数据库中的部分匹配?,php,mysql,Php,Mysql,我想做一种黑名单,所以我存储在我的数据库 id|value ----------- 1|test.com 2|example@ 3|@another. ... 现在,我正在寻找一种最快的方法来检查给定的字符串(例如emailAddress)是否与数据库中的一部分值匹配 例如 my@mail.com->数据库中无结果->无垃圾邮件 example@mail.com->与ID2->垃圾邮件匹配 有没有办法做到这一点,内幕人士,MySQL声明 目前我只看到加载数组中所有值的方法,但这种方法需要大量
id|value
-----------
1|test.com
2|example@
3|@another.
...
现在,我正在寻找一种最快的方法来检查给定的字符串(例如emailAddress)是否与数据库中的一部分值匹配
例如
my@mail.com->数据库中无结果->无垃圾邮件
example@mail.com->与ID2->垃圾邮件匹配
有没有办法做到这一点,内幕人士,MySQL声明
目前我只看到加载数组中所有值的方法,但这种方法需要大量资源,而且速度非常慢
非常感谢。使用如下查询:
SELECT * FROM `table_name` WHERE `value` LIKE '%emailadress%';
可以只在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
SELECT
*
FROM
blacklist
WHERE
MATCH (blacklist.`value`)
AGAINST (
(
'test example'
)
IN BOOLEAN MODE
)
结果
| word | id | value |
| ------- | --- | -------- |
| test | 1 | test.com |
| example | 2 | example@ |
或者,对于在更大的表上扩展的更优化版本,您必须使用全文索引和MATCH()
查询
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
SELECT
*
FROM
blacklist
WHERE
MATCH (blacklist.`value`)
AGAINST (
(
'test example'
)
IN BOOLEAN MODE
)
请参见使用
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 |
+----------+
请参阅。查看@Nick
,就像检查某个值与另一个值一样。你有什么建议-从db中选择所有项目,并在每个项目上使用like
?我只想在至少有一个匹配项的情况下获取信息,这足以知道它是spamI。我想这会导致该WHERE
子句上的或子句的列表不断增加。如果在每个页面请求上都执行此查询,那么最终可能值得在内存中缓存黑名单表并执行签入代码,不时刷新缓存。@u\u mulder这是一个黑名单,因此他必须检查每个值。。。或者我没有领会你的意思?这是错误的-你需要另一种方法:哪里是正确的my@email.address“像concat(“%”,value,“%”)
@PrakashG这不是它应该采取的方式-我必须检查电子邮件是否匹配(也是电子邮件的一部分)-如果我按照你的方式做,test@test.com威尔·伊格诺尔。@StefB,我给你的只是一个暗示,这里的任何人都不应该给你在你的上下文中所要求的直接答案,这需要按照要求来塑造。我相信LIKE在这种情况下会对您有所帮助。如果可能的话,这就是我需要从表_name中选择*的地方,比如“%emailAddress%”;在里面VALUE@StefB试试我的评论