Должны совпадать все слова в МАТЧЕ ПРОТИВ 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
колонка тоже.
Нажмите здесь для демонстрации
Надеюсь, поможет!