





Попробуйте использовать 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;
Он делает возврат случайным образом каждый раз, когда я запускаю запрос. Он не исправлен.
Извините, я неправильно понял ваше требование. Попробуйте использовать ORDER BY FIELD (id, ...).
Я считаю, что вы хотите использовать 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 действительно проще, здесь поздно винить в этом
Новогодний сюрприз +1. Я живу уже 1 января :-)
получил от меня все самое лучшее на Новый год ;-)
** Обновлено Если вы хотите фиксированный порядок, вы можете использовать ORDER BY FIELD:
SELECT * FROM events
WHERE id IN (4, 5, 9, 11)
ORDER BY FIELD (id, 11, 4, 9, 5)
OP хочет фиксированный порядок, см. Комментарии под моим ответом.
Не уверен, почему за это проголосовали ... потому что это не соответствует требованиям для начала темы.
Немного не по теме, но вы можете объединить эти пункты where в
WHERE id IN (11, 4, 9, 5). Порядок, в котором они появляются в WHERE, не влияет на порядок, в котором они возвращаются, хотя у других есть несколько хороших советов о том, как расположить их так, как вы хотите.