@kirill-93

Как составить запрос MySQL?

Здравствуйте. В базе есть таблица музыкальных групп, нужно организовать поиск названию и сортировку по позиции вхождения подстроки.
То есть:
- вводим слово "cat", находятся все группы, в названии которых есть слово cat и чем ближе оно к началу названия, тем выше результат. Группы, начинающиеся с "cat" будут первыми.
Этого я добился вот таким запросом:
SELECT `id`, `name`, LOCATE('cat', `name`) 
FROM `artists` 
WHERE `name` LIKE '%cat%' 
ORDER BY LOCATE('cat', `name`)

И тут я столкнулся с проблемой, что поиск по LIKE '%cat%' находит и "Accent Sensitive" результаты. То есть и cat и cät и čat и сät. Это правильно, но ORDER BY LOCATE('cat', `name`) не может их отсортировать правильно.
Получается что LIKE находит синонимы букв из других языков, а LOCATE не может с ними работать.
Как заставить заставить его сортировать их тоже?
И еще вопрос, как можно заменять символы при поиске? Например есть группа $hort, ее нужно уметь искать по запросу 'short'.
Не предлагайте, пожалуйста, поисковые движки. Нужно сделать это на сыром mysql.
Спасибо.
  • Вопрос задан
  • 157 просмотров
Решения вопроса 1
@kirill-93 Автор вопроса
Решил вот таким запросом
SELECT `artists`.`id`, IF(LOCATE('cat', `name`) = 0, 10000, LOCATE('cat', `name`)) AS `locate_index`
FROM `artists` 
WHERE (`name` LIKE '%cat%' OR REPLACE (`name`, '$ ', 's' LIKE '%cat%' )) 
ORDER BY `locate_index`
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
romy4
@romy4
Exception handler
Вам нужен collate для таблицы не как обычно utf8_general, а utf8_unicode
LIKE не находит синонимы, а механизм локализации для general убирает все диекриты и прочие крышечки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы