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

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

SELECT DISTINCT ClassName FROM SiteTree ORDER BY ClassName

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

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

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

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

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

Редактировать:

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

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


person Luke H    schedule 08.03.2010    source источник
comment
Добро пожаловать в SO Люк. Некоторые примеры данных, пожалуйста!   -  person Pekka    schedule 09.03.2010
comment
Я попытался добавить ASC / DESC, так как я действительно сошел с ума :)   -  person Luke H    schedule 09.03.2010


Ответы (5)


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

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

person Cruachan    schedule 08.03.2010
comment
Это было бы первым, что я бы проверил, сделал SELECT char_length(ClassName), ClassName и искал аномалии. - person jishi; 09.03.2010
comment
В данном случае таких проблем не было, но проверить всегда полезно. - person Luke H; 09.03.2010

Эврика!

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

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

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

Однако спасибо за полезные предложения.

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

SELECT DISTINCT ClassName FROM SiteTree ORDER BY CAST(ClassName AS CHAR) 
person Luke H    schedule 08.03.2010
comment
Обычно я не +1, когда пользователи понимают, что они просто что-то забыли, но ваш ответ объясняет ситуацию, в которой другие могут легко оказаться, и дает функцию для ее исправления. Рад, что вы решили это и опубликовали, чтобы сообщить нам. - person Anthony; 09.03.2010
comment
Ваше здоровье! Я нахожу здесь много полезного, надеюсь, я спасу кого-то еще от одного из тех моментов, когда бьешься головой о стол. - person Luke H; 09.03.2010

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

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

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

person Anthony    schedule 08.03.2010

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

person Williham Totland    schedule 08.03.2010
comment
даже если бы таблица была отсортирована до различных, она все равно была бы отсортирована. - person jishi; 09.03.2010

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

person mosheb    schedule 08.03.2010