Как ORDER BY работает с однозначными выражениями в MySQL? - PullRequest
3 голосов
/ 28 февраля 2012

У меня проблема с order by.Мы знаем, что если мы дадим целое число в порядке, то он упорядочится через индекс столбца.Когда я использую его таким образом, каждый раз, когда я выполняю запрос, я получаю один и тот же результат, который является правильным.

Но когда я делаю это значение результатом выражения (я имею в виду, что я использую выражение, которое всегда оценивается как 1), затем я получаю 3 возможных комбинации результата, когда выполняю его.

То есть для того же значения, которое является статическим, тот же результат;но для того же значения, которое является вычисляемым выражением, разные результаты.

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

SELECT SomeColumns, (rand()* 10) as rand
FROM TableName
ORDER BY (if ((rand in (1) ), 1,1))
LIMIT 0 , 6

Приведенный выше запрос дает три возможных набора результатов.

Ответы [ 3 ]

1 голос
/ 28 февраля 2012

ORDER BY s синтаксис is:

ORDER BY {col_name | expr | position} [ASC | DESC], ...

Хотя человеческому глазу может показаться эквивалентным следующее:

ORDER BY 1
ORDER BY (if ((rand in (1) ), 1,1))

это не так.

  • Первый сортируется по данным 1-го столбца, так как это целое число со значением 1.

  • Второй, хотя он оценивается как 1, является не целым числом, а выражением, и, таким образом, вызывается другой механизм сортировки . Для каждой строки выражение 1 вычисляется и используется для определения положения строки; поскольку ваше выражение вообще не ссылается на данные строк, ваши результаты будут совершенно непредсказуемыми.

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

Обычно вы пишете что-то вроде этого для выражения:

ORDER BY `col` % 6

... то есть что-то, что ссылается на данные.

1 голос
/ 28 февраля 2012

Посмотрите на синтаксис оператора SELECT;ORDER BY предложение определяется как:

ORDER BY {col_name |expr |position}

Далее на этой странице упоминается:

Позиции столбцов являются целыми числами и начинаются с 1

Сортировать по позициям столбцов работаеткак и ожидалось, когда он указан как целое число литерал .В вашем случае ORDER BY (if ((rand in (1) ), 1,1)) - это выражение, а не позиция столбца.Он работает следующим образом:

  • Столбец rand добавляется ко всем строкам, содержащим значения от 0,0 до 9,9999 ...
  • Выражение if(rand in (1), 1, 1) вычисляется для каждой строкиследующим образом:
    • Подвыражение rand in (1) почти всегда возвращает ложь, поскольку вероятность того, что столбец rand будет точно равен 1, очень, очень, очень низок
    • В зависимости от предыдущеговыражение, условие IF оценивается как 1 или 1 (возможно, это была опечатка в вашем коде)
    • Целое выражение оценивается как 1 для каждой строки
  • Поскольку выражение в предложении ORDER BY дает 1 для каждой строки, строки не будут отсортированы
0 голосов
/ 28 февраля 2012
ORDER BY (if ((rand in (1) ), 1,1))

он упорядочил ваш набор результатов на основе выражения.для динамического значения он также переупорядочивается на основе вашего order by выражения

...