Ответ 1
Собственно, это лучше:
SELECT * FROM your_table
WHERE id IN (5,2,6,8,12,1)
ORDER BY FIELD(id,5,2,6,8,12,1);
содержит документацию FIELD:
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field
Я выбираю набор записей учетных записей из большой таблицы (миллионы строк) с целыми значениями id. Как базовый вопрос, как получить, в некотором смысле. Что я делаю для нас, создавая большой список, разделенный запятыми, и передавая это в запрос как предложение "in" . Сейчас результат полностью неупорядочен. То, что я хотел бы сделать, - вернуть результаты в порядке значений в предложении "in" .
Я предполагаю, что вместо этого мне придется создать временную таблицу и сделать соединение вместо этого, чего я бы хотел избежать, но не могу.
Мысли? Размер запроса прямо сейчас ограничен примерно на 60 тыс., Поскольку мы пытаемся ограничить размер вывода, но он может быть сколь угодно большим, что может исключать "in" запрос в любом случае с практической точки зрения, если не физический.
Спасибо заранее.
Собственно, это лучше:
SELECT * FROM your_table
WHERE id IN (5,2,6,8,12,1)
ORDER BY FIELD(id,5,2,6,8,12,1);
содержит документацию FIELD:
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field
Немного трюка....
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 в список, указанный в списке.
Если ваш запрос равен 60K, это признак того, что вы делаете это неправильно.
Нет другого способа упорядочить результат, чем с помощью предложения ORDER BY. У вас может быть сложное предложение CASE в вашем заказе, перечислив все элементы в вашем разделе IN снова, но тогда ваш запрос, вероятно, будет 120K.
Я знаю, что вы этого не хотите, но вы должны поместить значения в предложение IN в таблицу или временную таблицу и присоединиться к ней. Вы также можете включить столбец SortOrder во временную таблицу и заказать это. Базы данных, такие как объединения. Выполнение этого способа поможет вашему запросу выполнить работу.
В первом запросе обязательно используется предложение 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