Как вернуть записи в MySQL с "кастомным" порядком

Я пытаюсь вернуть записи по их идентификаторам в MySQL без заказа.

Но когда я запускаю запрос, он упорядочивает их от наименьшего идентификатора к наибольшему.

SELECT * FROM events WHERE id=11 or id=4 or id=9 or id=5

Результат будет таким: 4,5,9,11

Как можно вернуть вот так: 11,4,9,5

Немного не по теме, но вы можете объединить эти пункты where в WHERE id IN (11, 4, 9, 5). Порядок, в котором они появляются в WHERE, не влияет на порядок, в котором они возвращаются, хотя у других есть несколько хороших советов о том, как расположить их так, как вы хотите.

Nate 01.01.2019 03:20
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
1
185
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Попробуйте использовать ORDER BY FIELD (id, ...):

SELECT *
FROM events
WHERE id IN (4, 5, 9, 11)
ORDER BY FIELD (id, 11, 4, 9, 5)

Демо

Что касается того, почему ваш текущий запрос показывает порядок 4,5,9,11, даже без использования явного предложения ORDER BY, одно из объяснений состоит в том, что столбец id является кластеризованным первичным ключом для вашей таблицы. В этом случае данные фактически будут храниться на диске в этом порядке, и при выборе это будет возвращаемый естественный порядок.

Редактировать:

У других поставщиков баз данных, которые не поддерживают FIELD, мы можем сделать заказ, используя выражение CASE:

SELECT *
FROM events
WHERE id IN (4, 5, 9, 11)
ORDER BY
    CASE WHEN id = 11 THEN 1
         WHEN id = 4  THEN 2
         WHEN id = 9  THEN 3
         WHEN id = 5  THEN 4
         ELSE 5 END;

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

Pshtiwan KarDo 01.01.2019 03:16

Извините, я неправильно понял ваше требование. Попробуйте использовать ORDER BY FIELD (id, ...).

Tim Biegeleisen 01.01.2019 03:18

Я считаю, что вы хотите использовать FIELD()

SELECT * FROM events WHERE id=11 or id=4 or id=9 or id=5
ORDER BY FIELD(id, 11,4,8,5)

Или более ANSI SQL метод (работает также для других поставщиков баз данных)

SELECT 
 events.*
FROM (
  SELECT 
     11 AS id
   , 1 AS position
  UNION ALL
  SELECT
     4 AS id
   , 2 AS position
  UNION ALL
  SELECT
     8 AS id
   , 3 AS position 
  UNION ALL
  SELECT 
     5 AS id
   , 4 AS position 
) AS sorting
INNER JOIN 
 events 
ON
 sorting.id = events.id
ORDER BY 
 sorting.position ASC

Или лучше ANSI SQL, как он должен (работает также для других поставщиков баз данных)

SELECT * FROM events WHERE id=11 or id=4 or id=9 or id=5
ORDER BY CASE WHEN id = 11 THEN 1
              WHEN id = 4 THEN 2
              WHEN id = 8 THEN 3
              WHEN id = 5 THEN 4
              ELSE 5
         END

«Замена FIELD в другой базе данных - это действительно CASE, а не запрос объединения». на самом деле, но союз тоже работает @TimBiegeleisen CASE WHEN id = 11 THEN 1 WHEN id = 4 THEN 2 WHEN id = 8 THEN 4 WHEN id = 5 THEN 4 ELSE 5 END действительно проще, здесь поздно винить в этом

Raymond Nijland 01.01.2019 03:39

Новогодний сюрприз +1. Я живу уже 1 января :-)

Tim Biegeleisen 01.01.2019 03:40

получил от меня все самое лучшее на Новый год ;-)

Funk Forty Niner 01.01.2019 03:42

** Обновлено Если вы хотите фиксированный порядок, вы можете использовать ORDER BY FIELD:

SELECT * FROM events
WHERE id IN (4, 5, 9, 11)
ORDER BY FIELD (id, 11, 4, 9, 5)

OP хочет фиксированный порядок, см. Комментарии под моим ответом.

Tim Biegeleisen 01.01.2019 03:20

Не уверен, почему за это проголосовали ... потому что это не соответствует требованиям для начала темы.

Raymond Nijland 01.01.2019 03:25

Другие вопросы по теме