Как расставить приоритеты при выборе запроса LIKE на основе позиции строки в поле?

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

Если у меня есть, например, таблица, такая как:

tblPlaces
id     country
1      Balanca
2      Cameroon
3      Canada
4      Cape Verde
5      Denmark

Для примера, скажем, я хочу вернуть две строки - и да, для этого примера я создал страну там;) Я хочу расставить приоритеты для любого экземпляра, в котором частичная строка совпадает в начале страны. Запрос, который я начал использовать, поэтому:

SELECT id, country FROM tblPlaces WHERE country LIKE 'ca%' LIMIT 2

Это вернуло "Камерун" и "Канаду", как и ожидалось. Однако в тех случаях, когда нет двух имен, в которых строка совпадает в начале слова (например, "de"), я хочу, чтобы она выглядела в другом месте слова. Поэтому я пересмотрел запрос, чтобы стать

SELECT id, country FROM tblPlaces WHERE country LIKE '%ca%' LIMIT 2

Затем это вернуло "Кабо-Верде" и "Данию", но при этом прервал мой первоначальный поиск "ca", который теперь возвращает "Balanca" и "Cameroon".

Итак, мой вопрос заключается в том, как это сделать, используя один запрос, который будет определять приоритет совпадения в начале слова (возможно, мне нужно использовать REGEXP?). Я также предполагаю, что, если столбец "страна" проиндексирован, эти совпадения будут по крайней мере возвращены с последующим алфавитным приоритетом (например, Камерун перед Канадой и т. д.).

1 ответ

Если вы хотите расставить приоритеты матчей, которые находятся именно в начале...

SELECT id, country
FROM tblPlaces
WHERE country LIKE '%ca%'
ORDER BY CASE WHEN country LIKE 'ca%' THEN 0 ELSE 1 END, country
LIMIT 2

РЕДАКТИРОВАТЬ

Более общий и, возможно, более быстрый (при условии, что "чем ближе к началу, тем лучше матч")...

SELECT id, country
FROM tblPlaces
WHERE country LIKE '%ca%'
ORDER BY INSTR(country, 'ca'), country
LIMIT 2
Другие вопросы по тегам