2010-11-16 7 views
3

При запросе db для набора идентификаторов mysql не дает результатов в порядке, в котором указаны идентификаторы. Запрос, который я использую, следующий:избежать сортировки по MYSQL IN Ключевое слово

SELECT id ,title, date FROM Table WHERE id in (7,1,5,9,3) 

в свою очередь, полученный результат находится в заказе 1,3,5,7,9.

Как я могу избежать этого авто сортировки

+0

Я получил этот запрос от одного из разработчиков моей компании, я просто отвечаю: «Кажется, у вас есть точная информация о 7,1,5,9,3, почему вам все еще нужно сортировать ее снова?» – ajreal

+0

@ ajreal Я получаю эти идентификаторы с другого сервера. n Мне нужно запросить db в соответствующем порядке. я не хочу сортировать его, db возвращается отсортированным способом .. я хочу избежать сортировки :) –

+0

.. ARGGGGG ...у вас уже есть эти идентификаторы в ORDER из '7,1,5,9,3', почему вам нужно снова отсортировать их? Два решения: «Запросите один идентификатор по id». 'Или используйте массив держателей мест, который является вашим первоначальным заказом и извлекает результаты из базы данных в любом порядке, зациклируйте массив держателей мест и установите его соответствующим образом. У вас уже есть курица, почему вы все еще задаетесь вопросом, как кладут яйца? – ajreal

ответ

2

Там нет автоматической сортировки или сортировки по умолчанию происходит. Сортировка, которую вы видите, скорее всего, является естественной сортировкой строк в таблице, т.е. порядок, в который они были вставлены. Если вы хотите, чтобы результаты отсортировались каким-либо другим способом, укажите его с помощью предложения ORDER BY. В SQL нет способа указать, что порядок сортировки должен следовать порядку позиций в предложении IN.

+3

Более точно, нет способа указать порядок в предложении WHERE. – JohnFx

+0

@JonhFx: +1 Спасибо за расширение сферы моего заявления. – Asaph

+0

прочитайте вопрос, попробуйте по вашему запросу .. он сортирует, когда вы указываете ключевое слово по-прежнему .. в любом случае .. я просто добавил ORDER BY FIELD (id, {values}) в конце, и он сработал. –

8

Если вы хотите заказать свой результат по id в порядке, указанном в in clause вы можете использовать FIND_IN_SET как:

SELECT id ,title, date 
FROM Table 
WHERE id in (7,1,5,9,3) 
ORDER BY FIND_IN_SET(id,'7,1,5,9,3') 
+0

Креативное решение. Возможно, это хорошо работает на больших наборах? – Asaph

+0

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

+1

@Asaph: Он работает для большого набора, необходимо * часть * хорошо видеть. О вашем втором комментарии: я пробовал это на двузначных числах и, похоже, работает нормально. – codaddict

0

Предложение в SQL WHERE не влияет на порядок сортировки; это делает предложение ORDER BY.

Если вы не указали порядок сортировки с использованием ORDER BY, SQL будет выбирать свой собственный порядок, который обычно будет порядком первичного ключа, но может быть любым.

Если вам нужны записи в определенном порядке, вам необходимо указать предложение ORDER BY, которое сообщает SQL о заказе, который вы хотите.

Если заказ, который вы хотите, основан исключительно на этой нечетной последовательности идентификаторов, то вам нужно указать это в предложении ORDER BY. Это будет сложно определить именно это. Это возможно, но потребуется некоторый неудобный код SQL и значительно замедлит запрос (из-за того, что он больше не использует ключ для поиска записей).

Если ваша желаемая идентификационная последовательность связана с каким-либо другим фактором, который является более предсказуемым (например, вы действительно хотите, чтобы записи в алфавитном порядке имен), вы можете просто сделать ORDER BY name (или что бы то ни было в этом поле).

Если вы действительно хотите, чтобы сортировать по идентификатору в произвольной последовательности, вам может понадобиться для создания временного поля, которое можно использовать для сортировки:

SELECT *, 
CASE id 
    WHEN 7 THEN 1 
    WHEN 1 THEN 2 
    WHEN 5 THEN 3 
    WHEN 3 THEN 4 
    WHEN 9 THEN 5 
END AS mysortorder 
FROM mytable 
WHERE id in (7,1,5,9,3) 
ORDER BY mysortorder; 
+0

хорошо .. спасибо за информацию .. но я генерирую запрос во время выполнения .. так что это будет немного длиннее .. Я просто добавил ORDER BY FIELD (id, {values}) на конец запроса .. im просто беспокоился о проблемах с производительностью –

0

поведение вы видите, является результатом Оптимизация запросов, я ожидаю, что у вас есть индекс на id, так что оператор IN будет использовать индекс для возврата записей самым эффективным способом. Поскольку оператор ORDER BY не указан, база данных будет считать, что порядок записей возврата не важен и будет оптимизирован для скорости. (Оформить заказ "EXPLAIN SELECT")

Ответ CodeDdicts или Spudley даст желаемый результат. Альтернативой является назначение приоритета идентификатора в «mytable» (или другой таблице) и использование этого для упорядочения записей по желанию.

Смежные вопросы