Подтвердить что ты не робот

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 для заказа, как по имени района, так и по имени школы. Единственная проблема в том, что я хочу, чтобы нулевой округ был внизу, чтобы затем я мог использовать группу под названием "Другое" в конце моего вывода.

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

4b9b3361

Ответ 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...)

удача