2016-06-24 2 views
0

У меня есть таблица с 3 миллионами строк, которая состоит из городов, стран, в которых лежит город, и некоторых других данных.MySQL Выберите сначала конкретные значения столбца

Я хочу получить, например, ограниченные строки, где название города начинается с определенной строки, но сначала укажите те, которые лежат в определенной стране.

Я попытался их упорядочить страна <> «us», которая очень медленная, так как сервер должен сортировать все найденные строки до применения лимита.

Теперь я пришел со следующим утверждением:

(SELECT * FROM cities WHERE city LIKE "ab%" AND country = "at" LIMIT 5) 
UNION 
(SELECT * FROM cities WHERE city LIKE "ab%" LIMIT 5) 
LIMIT 5 

Это очень быстро с любой длины префикса, но это выглядит своего рода грязный.

Есть ли более эффективный способ сделать это?

+0

Я думаю, что так же хорошо, как и получается. – Barmar

+0

Я не следую логике запроса. Кроме того, почему вы применяете 'LIMIT 5' снаружи, когда у вас уже есть только 10 записей? –

+1

@TimBiegeleisen Потому что он хочет всего 5 строк в конечном результате. Если из 'at' меньше 5 строк, он хочет заполнить оставшиеся слоты из других стран. – Barmar

ответ

0
select top 5 * 
, case when country = 'ab' then 1 
    else 0 end as rnk 
from cities 
where lower(city) like 'ab%' 
or country = 'ab' 
order by rnk desc; 
+0

Это не MySQL. Во всяком случае, этот запрос по-прежнему нуждается в сервере для сортировки результата, который опять же очень медленный с таким количеством строк в таблице. – Megatron

Смежные вопросы