Как проверить MySQL, если строка соответствует частям из базы данных?

Я хочу сделать своего рода черный список, поэтому я храню в своей базе данных

id|value
-----------
1|test.com
2|example@
3|@another.
...

Теперь я ищу самый быстрый способ проверить, соответствует ли данная строка (например, адрес электронной почты) части значений из БД.

Например
my@mail.com -> нет результатов в БД -> нет спама
example@mail.com -> совпало с ID2 -> спам

Есть ли способ сделать это, инсайдер, оператор MySQL?

На данный момент я вижу только способ загрузить все значения в массиве, проверьте это, но этот способ требует много ресурсов, и это действительно медленно.

Большое спасибо.

-2

Решение

Используйте Query следующим образом:

SELECT * FROM `table_name` WHERE `value` LIKE '%emailadress%';
2

Другие решения

Полная обработка возможна только в 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
)

Увидеть демонстрация

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.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector