ORDER BY ASC с нулями в нижней части
Я пишу 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 для заказа, как по имени района, так и по имени школы. Единственная проблема в том, что я хочу, чтобы нулевой округ был внизу, чтобы затем я мог использовать группу под названием "Другое" в конце моего вывода.
Можно ли заказать по возрастанию с нулями в конце вывода?
Ответы
Ответ 1
Только через 1 минуту после ответа на вопрос я нашел свой ответ. В порядке использования по предложению предложение для получения значений null имеет более высокое значение, чем что-либо еще:
ORDER BY (CASE WHEN districts.id IS NULL then 1 ELSE 0 END),districts.name, schools.name;
Ответ 2
Вы можете использовать функцию ISNULL()
.
Из руководства MySQL:
ISNULL (expr
)
Если expr
- NULL
, ISNULL()
возвращает 1
, в противном случае он возвращает 0
.
Например:
ORDER BY ISNULL(districts.name), districts.name, schools.name
Мне нравится использовать это вместо опции CASE
для MySQL. Просто имейте в виду, что он не переносится, поскольку ISNULL()
не является стандартным SQL и работает по-разному в других версиях SQL.
Ответ 3
Нули по умолчанию расположены вверху, но вы можете использовать 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
Ответ 4
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
добавьте больше правил сортировки, чтобы установить "новый" колумн и использовать любое число
спрячьте поле в своем коде, проверьте, если это possebele, чтобы сортировать по if dirctly (order by if...)
удача