ORDER BY и = (равно) в MYSQL - PullRequest
       0

ORDER BY и = (равно) в MYSQL

8 голосов
/ 11 октября 2011

У меня вопрос, я наткнулся на интересную часть кода.В операторе MySQL есть что-то вроде:

{...} ORDER BY независимо от = 3 ASC, независимо от = 4 ASC, независимо от = 6 ASC {...}

Значит ли это, что он будет упорядочен таким образом?:

thing | whatever  
15    | 1
1     | 3
5     | 3
8     | 3
2     | 4
3     | 4
6     | 4 
4     | 6
7     | 6
9     | 6
14    | 9
21    | 10
18    | 9 
...

Кажется, что сортируется только то, что равно 3,4 и 6, остальные неупорядочены ...

Это правильный / поддерживаемый синтаксис?

Ответы [ 2 ]

7 голосов
/ 11 октября 2011

whatever=3 оценивается как логическое значение с 0 как false и 1 как true.

Поскольку он заказан в порядке возрастания, он будет заказан в порядке возрастания.Затем в игру вступает второй упорядоченный столбец whatever=4, в котором whatever=4 будет последним в этой группе и т. Д.

Для столбцов, в которых whatever отсутствует (3,4,6), длядействовать как средство разрешения конфликтов, а порядок произвольный.

Это поддерживаемый синтаксис в MySQL, но не стандартный или переносимый.

1 голос
/ 11 октября 2011

На самом деле он упорядочивается по результату сравнения, который является логическим значением 0 или 1. Результирующий код выглядит примерно так (псевдокод):

ORDER BY
   CASE whatever = 3 THEN 1 ELSE 0
   ASC,
   CASE whatever = 4 THEN 1 ELSE 0
   ASC

К чему в итоге приходитзначение находится в списке),

ORDER BY 0,0,1
ORDER BY 0,1,0

и, если значение отсутствует в списке:

ORDER BY 0,0,0

Значения, отсутствующие в списке, рассматриваются с одним и тем же значением.и не упорядочены, и значения в списке упорядочены на основе позиции в списке.

Вы можете заменить это на ORDER BY FIELD(whatever, 3,4,6) ( документация )

...