Подтвердить что ты не робот

Сортировка по порядку значений в предложении select в разделе "in" в mysql

Я выбираю набор записей учетных записей из большой таблицы (миллионы строк) с целыми значениями id. Как базовый вопрос, как получить, в некотором смысле. Что я делаю для нас, создавая большой список, разделенный запятыми, и передавая это в запрос как предложение "in" . Сейчас результат полностью неупорядочен. То, что я хотел бы сделать, - вернуть результаты в порядке значений в предложении "in" .

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

Мысли? Размер запроса прямо сейчас ограничен примерно на 60 тыс., Поскольку мы пытаемся ограничить размер вывода, но он может быть сколь угодно большим, что может исключать "in" запрос в любом случае с практической точки зрения, если не физический.

Спасибо заранее.

4b9b3361

Ответ 2

Немного трюка....

SELECT * FROM your_table
WHERE id IN (5,2,6,8,12,1)
ORDER BY FIND_IN_SET(id,'5,2,6,8,12,1') DESC;

обратите внимание, что список идентификаторов в find_in_set является строкой, поэтому ее цитирует. Также обратите внимание, что без DESC они возвращаются в порядке REVERSE в список, указанный в списке.

Ответ 3

Если ваш запрос равен 60K, это признак того, что вы делаете это неправильно.

Нет другого способа упорядочить результат, чем с помощью предложения ORDER BY. У вас может быть сложное предложение CASE в вашем заказе, перечислив все элементы в вашем разделе IN снова, но тогда ваш запрос, вероятно, будет 120K.

Я знаю, что вы этого не хотите, но вы должны поместить значения в предложение IN в таблицу или временную таблицу и присоединиться к ней. Вы также можете включить столбец SortOrder во временную таблицу и заказать это. Базы данных, такие как объединения. Выполнение этого способа поможет вашему запросу выполнить работу.

Ответ 4

В первом запросе обязательно используется предложение order by. Таким образом, вы можете просто выполнить соединение и использовать тот же порядок by by.

Например, если это был ваш первый запрос

SELECT customer_id
  FROM customer  
 WHERE customer_id BETWEEN 1 AND 100 
ORDER
    BY last_name

И это был ваш второй запрос

SELECT inventory_id
  FROM rental
 WHERE customer_id in (...the ordered list...)

Комбинированное будет

SELECT r.inventory_id
  FROM rental r
INNER
  JOIN customer c
    ON r.customer_id = c.customer_id    
 WHERE c.customer_id BETWEEN 1 AND 100 
ORDER
    BY c.last_name