Как вернуть записи в MySQL с «заказным» порядком - PullRequest
0 голосов
/ 01 января 2019

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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 01 января 2019

Полагаю, вы хотите использовать 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
0 голосов
/ 01 января 2019

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

SELECT * FROM events
WHERE id IN (4, 5, 9, 11)
ORDER BY FIELD (id, 11, 4, 9, 5)
0 голосов
/ 01 января 2019

Попробуйте использовать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...