MySQL ORDER BY возвращает вещи в (очевидно) случайном порядке? - PullRequest
4 голосов
/ 09 марта 2010

Следующий запрос:

SELECT DISTINCT ClassName FROM SiteTree ORDER BY ClassName

возвращает вещи в непонятном порядке!

Я получаю тот же результат, цитирую ли я имена столбцов / таблиц, или использую DISTINCT или нет, или добавляю ASC или DESC.

Я предположил, что индексы могут быть повреждены или что-то в этом роде, поэтому попытался сбросить и воссоздать. Также пробовал REPAIR TABLE и CHECK TABLE.

Для сортировки таблицы установлено значение latin1_swedish_ci. Все текстовые столбцы настроены на использование UTF-8, а параметры сортировки - utf8_general_ci

Что может быть причиной этого?

Edit:

Пример данных на pastie .

Результаты получены непосредственно из SQL-запроса, выполненного в клиенте MySQL (пробовали 2 разных клиентских приложения).

Ответы [ 5 ]

3 голосов
/ 09 марта 2010

Как были загружены ваши данные? Я видел несколько случаев, когда загрузка из какого-либо внешнего источника помещала пробел или другой подобный символ в первую позицию строки - в результате возвращаемый набор результатов фактически сортировался, но не так, как можно было бы ожидать.

Это может быть невероятно сложно обнаружить подобные вещи, и если я получу аномальные результаты того типа, который вы видите, в первую очередь я выберу поле, объединяющее «>» и «<» . </p>

2 голосов
/ 09 марта 2010

Эврика!

Хотя это правда, что использование функции вернет правильный порядок, например:

  SELECT DISTINCT ClassName FROM SiteTree ORDER BY REPLACE(ClassName,'','')

Оказывается, я смотрел на столбец ENUM (я забыл, подумал, что это обычный текст), и поэтому MySQL сортировал в соответствии с порядком элементов в ENUM.

Спасибо за полезные советы, однако.

Вот разумное решение, учитывая ситуацию.

SELECT DISTINCT ClassName FROM SiteTree ORDER BY CAST(ClassName AS CHAR) 
1 голос
/ 09 марта 2010

Нет причин, по которым это должно сработать, если посмотреть, поможет ли избавиться от смеси верблюжья оболочка:

  SELECT DISTINCT LOWER(LTRIM(ClassName)) AS classname 
  FROM SiteTree ORDER BY classname

Мне так понравилась идея Кручана, что я обновил свою идею, чтобы охватить ее. Убрать начальные пробелы.

0 голосов
/ 09 марта 2010

Если вы просматриваете результаты на веб-странице, возможно, вы просто видите кэшированный набор результатов из более раннего запроса.

0 голосов
/ 09 марта 2010

Возможно или действительно, что таблица отсортирована до DISTINCT ing. Попробуйте использовать статистическую функцию или GROUP BY

...