2015-07-23 2 views
0

Я хочу, чтобы список положительных значений весового столбца упорядочивался по весу в порядке возрастания, а затем отрицательные значения в любом порядке.mysql order by numeric column, разделяющий положительные и отрицательные значения

Это то, что я пробовал:

SELECT * 
FROM `mytable` 
WHERE weight >= 0 
ORDER BY weight 
UNION 
SELECT * 
FROM `mytable` 
WHERE weight < 0 
ORDER BY weight 

И я получил:

SQL Error (1221): Incorrect usage of UNION and ORDER BY

ответ

1

Просто используйте один запрос, а затем соответствующий order by:

SELECT * 
FROM `mytable` 
ORDER BY (weight >= 0) desc, 
     weight; 

MySQL обрабатывает логические значения в числовом контексте как число, поэтому выражение (weight >= 0) рассматривается как «1» (для положительного) и «0» (для отрицательного).

Вы не можете зависеть от порядка запроса union в любой ситуации, поскольку удаление дубликатов может сделать что-либо для заказа. Вы не должны зависеть от порядка с union all, потому что ничто в SQL не указывает, что строки из первого подзапроса возвращаются перед строками из второго (хотя на практике это верно).

В качестве примечания: ошибка, которую вы получаете, вызвана первым order by, а не вторым.

+0

безупречный! Большое спасибо ;-) – NotGaeL

Смежные вопросы