Сортировать по порядку значений в операторе выбора «в» предложении в MySQL - PullRequest
28 голосов
/ 02 февраля 2010

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

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

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

Заранее спасибо.

Ответы [ 4 ]

46 голосов
/ 03 февраля 2010

На самом деле, это лучше:

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

вот документация ПОЛЯ:

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field

4 голосов
/ 03 февраля 2010

Немного подвоха ....

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 их результаты возвращаются в обратном порядке к тому, что указан в списке.

0 голосов
/ 02 февраля 2010

Ваш первый запрос наверняка использует предложение order 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
0 голосов
/ 02 февраля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...