学校のテーブルを学区のテーブルに接続するSQLクエリを書いています。各学校が1つの地区に関連付けられている単純な1対多の関係。私のクエリは次のとおりです:
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
左加入をした理由は、すべての学校が地区に所属しているわけではないためです。たとえば、1つの学校がホームスクーリングであり、ホームスクーリングされているすべての生徒を含む場合があります。それは地区にはありません。
それで、私がしたいことは、ORDER BYを使用して、地区名と学校名の順に並べ替えることです。唯一の問題は、出力の最後に「その他」というグループを使用できるように、ヌルディストリクトを一番下にしたいことです。
出力の最後にnullを付けて昇順に並べることはできますか?
質問してからわずか1分で答えが見つかりました。 order by句の使用例では、nullを他よりも高い値にしています。
ORDER BY (CASE WHEN districts.id IS NULL then 1 ELSE 0 END),districts.name, schools.name;
ISNULL()
関数を使用できます。
MySQLマニュアルから:
ISNULL(
expr
)
expr
がNULL
の場合、ISNULL()
は_1
_を返し、それ以外の場合は_0
_を返します。
例:
_ORDER BY ISNULL(districts.name), districts.name, schools.name
_
MySQLのCASE
オプションの代わりにこれを使用したい。 ISNULL()
は標準SQLではなく、他のバージョンのSQLでは機能が異なるため、移植性がないことに注意してください。
デフォルトではヌルが上部に表示されますが、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
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 dirctlyで並べ替えることが可能かどうかをテストします(if by if ...)
幸運を