избегать сортировки по ключевому слову MYSQL IN - PullRequest
4 голосов
/ 16 ноября 2010

При запросе базы данных для набора идентификаторов mysql не предоставляет результаты в порядке, в котором были указаны идентификаторы.Я использую следующий запрос:

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

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

Как мне избежать этой автоматической сортировки

Ответы [ 4 ]

8 голосов
/ 16 ноября 2010

Если вы хотите заказать результат по 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')
3 голосов
/ 16 ноября 2010

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

0 голосов
/ 16 ноября 2010

Поведение, которое вы видите, является результатом оптимизации запросов, я ожидаю, что у вас есть индекс для идентификатора, так что оператор IN будет использовать индекс для возврата записей наиболее эффективным способом. Поскольку оператор ORDER BY не был указан, база данных будет считать, что порядок возвращаемых записей не важен, и будет оптимизировать скорость. (Оформить заказ "ОБЪЯСНИТЬ ВЫБОР")

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

0 голосов
/ 16 ноября 2010

Предложение WHERE в SQL не влияет на порядок сортировки;это делает предложение 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;
...