Возвращает результаты запроса в заранее определенном порядке

StackOverflow https://stackoverflow.com/questions/134379

  •  02-07-2019
  •  | 
  •  

Вопрос

Возможно ли выполнить оператор SELECT с заранее определенным порядком, т.е.выбор идентификаторов 7,2,5,9 и 8 и возвращаю их в таком порядке, основанный не на чем ином, как на поле ID?

Операторы ВЫБИРАЮТ id ИЗ таблицы, ГДЕ id в (7,2,5,9,8);и ВЫБЕРИТЕ id ИЗ таблицы, ГДЕ id в (8,2,5,9,7);оба возвращают их в одном и том же порядке.

Это было полезно?

Решение

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

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY FIND_IN_SET(id,"7,2,5,9,8");

даст разные результаты для

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY FIND_IN_SET(id,"8,2,5,9,7");

FIND_IN_SET НАЙТИ В НАБОРЕ возвращает положение id во втором приведенном к нему аргументе, так что для первого случая выше, id of 7 находится в позиции 1 в наборе, 2 в позиции 2 и так далее - mysql внутренне работает примерно так

id | FIND_IN_SET
---|-----------
7  | 1
2  | 2
5  | 3

затем заказы по результатам FIND_IN_SET.

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

УПОРЯДОЧИТЬ ПО ПОЛЮ (ID,7,2,4,5,8) - ваш лучший выбор, но это все равно некрасиво.

Не могли бы вы включить выражение case, которое сопоставляет ваши идентификаторы 7,2,5,...к ординалам 1,2,3,...а затем упорядочить по этому выражению?

Весь порядок упорядочивается по ключевым словам, однако вы можете сортировать только по возрастанию и убыванию.Если вы используете такой язык, как PHP, вы можете отсортировать их соответствующим образом, используя некоторый код, но я не верю, что это возможно только с MySQL.

Это работает в Oracle.Можете ли вы сделать что-то подобное в MySQL?

SELECT ID_FIELD
FROM SOME_TABLE
WHERE ID_FIELD IN(11,10,14,12,13)
ORDER BY
  CASE WHEN ID_FIELD = 11 THEN 0
       WHEN ID_FIELD = 10 THEN 1
       WHEN ID_FIELD = 14 THEN 2
       WHEN ID_FIELD = 12 THEN 3
       WHEN ID_FIELD = 13 THEN 4
  END

Возможно, вам потребуется создать временную таблицу с полем autonumber и вставить в нее данные в нужном порядке.Затем выполните сортировку по новому полю автономера.

Эм, не совсем.Самое близкое, что вы можете найти, это, вероятно,:

SELECT * FROM table WHERE id IN (3, 2, 1, 4) ORDER BY id=4, id=1, id=2, id=3

Но вы, вероятно, этого не хотите :)

Трудно дать вам какой-либо более конкретный совет без дополнительной информации о том, что содержится в таблицах.

Это халтурно (и, вероятно, медленно), но вы можете получить эффект, объединив ВСЕ:

SELECT id FROM table WHERE id = 7
UNION ALL SELECT id FROM table WHERE id = 2
UNION ALL SELECT id FROM table WHERE id = 5
UNION ALL SELECT id FROM table WHERE id = 9
UNION ALL SELECT id FROM table WHERE id = 8;

Редактировать: Другие люди упоминали функцию find_in_set, которая задокументирована здесь.

Ты здесь быстро получаешь ответы, не так ли…

Причина, по которой я спрашиваю об этом, заключается в том, что это единственный способ, который я могу придумать, чтобы избежать сортировки сложного многомерного массива.Я не говорю, что это было бы трудно отсортировать, но если бы существовал более простой способ сделать это с помощью прямого sql, то почему бы и нет.

Одним из решений Oracle является:

SELECT id FROM table WHERE id in (7,2,5,9,8)
ORDER BY DECODE(id,7,1,2,2,5,3,9,4,8,5,6);

При этом каждому идентификатору присваивается номер заказа.Работает нормально для небольшого набора значений.

Лучшее, что я могу придумать, это добавить второй столбец OrderColumn:

7 1
2 2
5 3
9 4 
8 5

А затем просто выполните ЗАКАЗ ПО OrderColumn

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top