Есть такая таблица в БД:
id title
1 one two
2 one three
3 one
4 three
5 one two three
и есть запрос вида:
SELECT id where title like '%one%' or title like '%three%
Он вернет все строки в которых будут значения 'one' 'three'. По сути он вернет подряд строки 1,2,3,4,5. Мне необходимо, чтобы он первыми вернул строки, в которых максимальное количество совпадений, т.е. должен вернуть 2,5,1,3,5.
Я думаю, что нужно по каждому найденому слову лайком добавлять какой-нибудь переменной score 1 очко, потом сортировать по этой переменной. Но как это сделать, не знаю.
Может есть какoe либо решение?
Сделать при помощи PHP не могу, т.к. данные с БД получаю порциями по 25 записей, а для того, чтобы обработать при помощи PHP необходимо получить весь набор данных.
Можно попробовать вот так:
SELECT id
FROM table_test
WHERE title like '%one%' or title like '%three%'
ORDER BY sum(CASE WHEN title REGEXP '(one|three)' THEN 1 ELSE 0 END) DESC
PS этот код не тестировался...
В принципе нашел интересное решение такого вида
SELECT name
FROM table_test
WHERE name LIKE '%строка_поиска%'
ORDER BY CASE
WHEN name LIKE 'строка_поиска' THEN 0
WHEN name LIKE 'строка_поиска %' THEN 1
WHEN name LIKE 'строка_поиска%' THEN 2
WHEN name LIKE '% строка_поиска%' THEN 3
ELSE 4
END
Доработал под свой вариант начало сортировать по совпадениям.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости