Упорядочение по порядку значений в предложении SQL IN () - PullRequest
139 голосов
/ 29 декабря 2008

Мне интересно, есть ли возможность (возможно, лучший способ) упорядочить по порядку значений в предложении IN ().

Проблема в том, что у меня есть 2 запроса, один из которых получает все идентификаторы, а второй - всю информацию. Первый создает порядок идентификаторов, по которым я хочу, чтобы второй упорядочил. Идентификаторы помещаются в предложение IN () в правильном порядке.

Так что это будет что-то вроде (очень упрощенно):

SELECT id FROM table1 WHERE ... ORDER BY display_order, name

SELECT name, description, ... WHERE id IN ([id's from first])

Проблема в том, что второй запрос не возвращает результаты в том же порядке, в котором идентификаторы вставлены в предложение IN ().

Одно решение, которое я нашел, состоит в том, чтобы поместить все идентификаторы во временную таблицу с автоматически увеличивающимся полем, которое затем присоединяется ко второму запросу.

Есть ли лучший вариант?

Примечание: Поскольку первый запрос выполняется «пользователем», а второй - в фоновом процессе, объединить запрос 2 в 1 с помощью подзапросов невозможно.

Я использую MySQL, но я думаю, что было бы полезно, чтобы он указывал, какие опции есть и для других БД.

Ответы [ 13 ]

1 голос
/ 29 декабря 2008

Моей первой мыслью было написать один запрос, но вы сказали, что это невозможно, потому что один запускается пользователем, а другой - в фоновом режиме. Как вы храните список идентификаторов для передачи от пользователя к фоновому процессу? Почему бы не поместить их во временную таблицу со столбцом для обозначения порядка.

Так как насчет этого:

  1. Бит пользовательского интерфейса запускается и вставляет значения в новую таблицу, которую вы создаете. Было бы вставить идентификатор, должность и некоторый идентификатор номера задания)
  2. Номер задания передается в фоновый процесс (вместо всех идентификаторов)
  3. Фоновый процесс делает выбор из таблицы на шаге 1, и вы присоединяетесь, чтобы получить другую необходимую вам информацию. Он использует номер задания в предложении WHERE и упорядочивает по столбцу позиции.
  4. Фоновый процесс после завершения удаляется из таблицы на основе идентификатора задания.
0 голосов
/ 16 августа 2016

Я только что попытался сделать это MS SQL Server, где у нас нет FIELD ():

SELECT table1.id
... 
INNER JOIN
    (VALUES (10,1),(3,2),(4,3),(5,4),(7,5),(8,6),(9,7),(2,8),(6,9),(5,10)
    ) AS X(id,sortorder)
        ON X.id = table1.id
    ORDER BY X.sortorder

Обратите внимание, что я также разрешаю дублирование.

0 голосов
/ 29 декабря 2008

Дайте этому шанс:

SELECT name, description, ...
WHERE id IN
    (SELECT id FROM table1 WHERE...)
ORDER BY
    (SELECT display_order FROM table1 WHERE...),
    (SELECT name FROM table1 WHERE...)

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

...