Вы можете сделать это:
SELECT p.public_post_id, COUNT(*)
FROM public_posts p JOIN bad_words b
ON public_message LIKE CONCAT('%', b.word, '%')
Но у него будет невероятно плохая производительность.Он должен будет выполнить количество поисков, равное количеству строк в public_posts
раз 1100 слов в bad_words
.
MySQL имеет функцию полнотекстовой индексации, но этоне будет работать для вашего случая.
https://dev.mysql.com/doc/refman/8.0/en/fulltext-restrictions.html говорит:
Аргументом AGAINST () должно быть строковое значение, которое является постоянным во время оценки запроса.Это исключает, например, столбец таблицы, поскольку он может различаться для каждой строки.
Другими словами, вы не можете сделать это:
SELECT ...
FROM public_posts p JOIN bad_words b
ON MATCH(p.public_posts) AGAINST(b.word) -- ERROR!
Вы можете искать по одному слову за раз, но тогда это потребует 1100 запросов.
Или вы можете сделать это с полнотекстовым индексом, перечислив много слов в выражении AGAINST:
SELECT ...
FROM public_posts p
WHERE MATCH(p.public_posts) AGAINST('word1 word2 word3 word4 word5...' IN BOOLEAN MODE)
Множество слов может быть списком, который вы генерируете, запрашивая таблицу bad_words
.
Но это не говорит о количестве совпадений на слово, только то, что сообщение содержало хотя бы одно совпадениеслово.
Кроме того, я не уверен, есть ли ограничение по длине, или вы можете сделать строку из всех 1100 плохих слов.
Я не знаю ни одной другой реализации полнотекстового поиска, котораясправится с этим лучше.