У меня есть таблица базы данных MySQL, в которой есть столбец "word" с разделительными знаками. Например:
one two three four five
Итак, учитывая вышеприведенную запись, я хочу найти другие записи, которые содержат одно или несколько значений, разделенных пробелами, и упорядочить результаты по большинству соответствующих совпадений. Как я могу добиться этого?
Например:
one two six seven eight
three nine ten eight seven
one two three six seven
one two three four ten
six seven eight nine ten
Я хотел бы вернуть следующее:
one two three four ten --4 matching values
one two three six seven --3 matching values
one two six seven eight --2 matching values
three nine ten eight seven --1 matching value
Это запрос, который я использую до сих пор:
SELECT * from MyTable WHERE words like '%one%' OR words like '%two%' OR words like '%three%' OR words like '%four%' OR words like '%five%'
Но это только выбирает результаты, которые разделяют одно или несколько слов. Как я могу отслеживать, сколько совпадений есть и заказать результаты в терминах?
Вы можете взглянуть на реализацию полнотекстового поиска, например тип, описанный здесь.
Хотя другим очень беспорядочным методом было бы использование подобных операторов, а затем проанализировать набор результатов с регулярным выражением, чтобы получить количество совпадений на запись, что позволит вам реализовать ранг на основе числа или совпадений.
Наслаждайтесь!
Я думаю, что нет простого и элегантного способа достижения этого. Мое решение таково:
SELECT MyTable.* FROM MyTable JOIN
(SELECT row_id, COUNT(*) AS count
FROM
(
SELECT row_id from MyTable WHERE words like '%one%'
UNION
SELECT row_id from MyTable WHERE words like '%two%'
)
GROUP BY row_id
) AS count_result
ON MyTable.row_id=count_result.row_id
ORDER BY count_result.count DESC