Должны совпадать все слова в МАТЧЕ ПРОТИВ mysql

SELECT *,
MATCH (`text`) AGAINST ('my work involves for' IN BOOLEAN MODE) `score`
FROM `messages` WHERE MATCH (`must_match`) AGAINST ('my work involves for' IN BOOLEAN MODE)
ORDER BY `score` DESC

Таким образом, здесь пользовательский ввод "моя работа включает в себя"

id   text                 must_match
---  ----                 ------
1    my work is to help   work,help
2    work involves help   involves,work

Теперь я хочу получить результат, если все слова столбца mus_match совпадают в пользовательском вводе. Итак, сверху строки наш результат будет 2-й строкой

столбец must_match будет содержать слова из текстового столбца

1 ответ

Потратив много времени, я не могу найти решение / обходной путь для вашей задачи. Основная причина этого заключается в том, что в вашей таблице есть многозначный атрибут: must_match, Он содержит значения, разделенные запятыми, и количество значений также не предопределено.

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

id        text1         must_match
1   my work is to help  work
1   my work is to help  help
2   work involves help  involves
2   work involves help  work

Теперь, если вы можете конвертировать свою таблицу в 1NF и хранить несколько значений must_match в нескольких строках (как описано выше), затем продолжайте читать для решения, и если нет, пожалуйста, прокомментируйте причину этого.

Решение:

select id,text1,
MATCH (text1) AGAINST ('my work involves for' IN BOOLEAN MODE) as score
from t t1
where locate(must_match,"my work involves for") > 0
group by id
having count(*) = (select count(*) from t where id = t1.id);

Примечание: если id это первичный ключ, то вы можете group by с помощью text колонка тоже.

Нажмите здесь для демонстрации

Надеюсь, поможет!

Другие вопросы по тегам