2016-07-31 8 views
1

Я создаю запрос mysql для функции поиска, теперь я хочу упорядочить результат определенным образом, используя массив идентификаторов.MYSQL Order by Field или Find_in_set без IN()

Я был в состоянии сделать это, используя кусок MYSQL, похожее на это:

SELECT id, name 
FROM mytable 
WHERE id IN (77, 3, 123, 1) 
ORDER BY FIELD(id, 77, 3, 123, 1) 

Но мне интересно, если это возможно Order by FIELD или FIND_IN_SET без установки IN() в запросе Select ,

Я не хочу использовать оператор IN(), потому что я также ожидаем, что результаты, которые не входят в массив идентификаторов

Надеюсь кто-то может толкать меня в правильном направлении,

Спасибо продвижение,

ответ

2

Если вы предпочитаете только одну оценку, вы можете изменить ваш заказ в field() и использовать

SELECT id, name 
FROM mytable 
ORDER BY FIELD(id, 1, 123, 3, 77) desc 

Это займет гораздо больше времени, чем исходный запрос, потому что field() стоит дороже, чем IN, и теперь вам нужно будет оценить field() для каждой строки вместо нескольких строк.

Альтернативой может быть использование

SELECT id, name, FIELD(id, 77, 3, 123, 1) as orderno 
FROM mytable 
WHERE id IN (77, 3, 123, 1) 
union 
SELECT id, name, 99999999 
FROM mytable 
WHERE id NOT IN (77, 3, 123, 1) 
order by orderno, id 

Это может быть быстрее, в зависимости от размера вашего массива, но вы должны проверить это, она также может быть хуже.

+0

Вы должны использовать 'UNION ALL', потому что два выбора имеют определенную пустоту пересечения. –

+0

Первый метод работал лучше всего для меня, это было всего на пару миллисекунд быстрее, чем с запросом NOT IN, но все имеет значение: P Спасибо за ваш ответ и объяснение! – Lennart

2
SELECT id, name 
FROM mytable 
ORDER BY id NOT IN (77, 3, 123, 1), 
     FIELD(id, 77, 3, 123, 1) 
+0

Пояснение необходимо. Изучите [ответ]. –

+0

Это выглядит хорошо для меня :) – Jordon

+0

Это отлично поработало, но, к сожалению, оно увеличило время загрузки длинных запросов на секунду или больше. Возможно, вы знаете какие-либо другие способы достижения этого, которые могут быть быстрее? – Lennart