MYSQL Заказ по полю или Find_in_set без IN()
Я строю запрос mysql для функции поиска, теперь я хочу упорядочить результат определенным образом, используя массив идентификаторов.
Я был в состоянии сделать это с помощью части 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()
в запросе выбора.
Я не хочу использовать оператор 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
Это может быть быстрее в зависимости от размера вашего массива, но вам придется проверить его, это может быть и хуже.
SELECT id, name
FROM mytable
ORDER BY id NOT IN (77, 3, 123, 1),
FIELD(id, 77, 3, 123, 1)