Как расставить приоритеты при выборе запроса LIKE на основе позиции строки в поле? - PullRequest
6 голосов
/ 07 июня 2011

Я пытаюсь запросить таблицу для ограниченного набора результатов, чтобы заполнить поле автозаполнения в 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» и «Камерун».

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

1 Ответ

10 голосов
/ 07 июня 2011

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

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
...