Dav*_*ong 38 mysql sql sql-order-by
我正在编写一个将学校表连接到地区表的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
Run Code Online (Sandbox Code Playgroud)
我做左派的原因是因为不是每个学校都附属于一个学区.例如,一所学校可能是家庭教育,可能包含所有在家接受教育的学生.那不会是在一个地区.
所以我想要做的是使用ORDER BY来按地区名称和学校名称进行排序.唯一的问题是我希望null区位于底部,以便我可以在输出结束时使用一个名为"Other"的组.
是否可以通过在输出结尾处以空值递增来进行排序?
Dav*_*ong 38
询问问题后仅1分钟我就找到了答案.使用order by子句使用case来使null具有比其他任何值更高的值:
ORDER BY (CASE WHEN districts.id IS NULL then 1 ELSE 0 END),districts.name, schools.name;
Run Code Online (Sandbox Code Playgroud)
tox*_*lot 25
你可以使用这个ISNULL()
功能.
从MySQL手册:
ISNULL(
expr
)如果
expr
是NULL
,则ISNULL()
返回1
,否则返回0
.
例如:
ORDER BY ISNULL(districts.name), districts.name, schools.name
Run Code Online (Sandbox Code Playgroud)
我喜欢使用它而不是CASE
MySQL 的选项.请注意,它不是可移植的,因为ISNULL()
它不是标准SQL,并且在其他SQL版本中的功能不同.
默认情况下,Null位于顶部,但您可以使用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