ЗАКАЗАТЬ ASC с нулями внизу - PullRequest
38 голосов
/ 13 мая 2011

Я пишу SQL-запрос, который соединяет таблицу школ с таблицей районов. Простые отношения «один ко многим», где каждая школа привязана к одному району. Мой запрос выглядит следующим образом:

SELECT 
    schools.id AS schoolid,
    schools.name AS school, 
    districts.id AS districtid, 
    districts.name AS district
FROM sms_schools AS schools
    LEFT JOIN sms_districts AS districts ON schools.districtid = districts.id
WHERE 1 = 1
ORDER BY districts.name, schools.name

Причина, по которой я вступил в левую группу, заключается в том, что не каждая школа привязана к району. Например, одна школа может быть обучена на дому, которая может содержать всех учащихся, обучающихся на дому. Это не было бы в районе.

Итак, я бы хотел использовать ORDER BY для заказа по названию района, а затем по названию школы. Единственная проблема заключается в том, что я хочу, чтобы нулевой район находился внизу, чтобы я мог использовать группу под названием «Другие» в конце моего вывода.

Можно ли заказать по возрастанию с нулями в конце вывода?

Ответы [ 4 ]

38 голосов
/ 13 мая 2011

Только через 1 минуту после постановки вопроса я нашел свой ответ. В предложении order by условие для создания пустых значений имеет большее значение, чем что-либо еще:

 ORDER BY (CASE WHEN districts.id IS NULL then 1 ELSE 0 END),districts.name, schools.name;
24 голосов
/ 07 декабря 2012

Вы можете использовать функцию ISNULL().

Из руководства MySQL :

ISNULL (expr)

Если expr равно NULL, ISNULL() возвращает 1, в противном случае возвращается 0.

Например:

ORDER BY ISNULL(districts.name), districts.name, schools.name

Мне нравится использовать это вместо опции CASE для MySQL.Просто имейте в виду, что не является переносимым , поскольку ISNULL() не является стандартным SQL и работает по-другому в других версиях SQL.

5 голосов
/ 13 мая 2011

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


SELECT schools.id AS schoolid,schools.name AS school, districts.id AS districtid, districts.name AS district FROM sms_schools AS schools LEFT JOIN sms_districts AS districts ON schools.districtid = districts.id WHERE 1 = 1 
ORDER BY isnull(districts.name,'1'), schools.name 

2 голосов
/ 13 мая 2011
SELECT
 schools.id AS schoolid,
 schools.name AS school,
 districts.id AS districtid,
 districts.name AS district,
 if(schools.districtid IS NULL,1,0) as sort 
FROM sms_schools AS schools
LEFT JOIN sms_districts AS districts 
 ON schools.districtid = districts.id
WHERE 1 = 1
ORDER BY sort, districts.name, schools.name

добавьте больше правил сортировки, введите "новый" столбец и используйте любое число. скрыть поле в вашем коде, проверить, является ли оно возможным для сортировки по if (непосредственно по if ...)

удачи

...