この記事を三行にまとめると
昇順でソートしつつNULLのデータは後ろに持っていきたいORDER BY column IS NULL ASC, column ASC
思ったよりも簡単にできました
MySQLで特定のカラムでソートをする時、NULLを許可しているカラムに対して昇順(ASC)でソートをかけるとNULLのデータが先に来ます。
でも仕様によっては昇順でソートしつつNULLのデータは後ろに持っていきたいという場合もあると思います。
そんな時はどう書くか。結論だけ先に言うとこんな感じのSELECT文を書けば昇順で並び替えつつNULLのデータを後ろに持っていくことができます。
例えばこんな感じのデータが入ったテーブルがあるとします。
カテゴリーのIDを紐づけたブログ記事のデータみたいなものをイメージです。
このデータに対して単純にカテゴリーIDでソートするとこんな感じになります。
NULLのデータが先に来ます。
でも先ほど書いた方法でソートするとこうなります。
IDの入ったデータは通常通り昇順でソートされ、IDがNULLのデータは後ろに来ていますね。
ASCは省略しても大丈夫です。ORDER BY句はASCやDESCを省略した場合は自動的にASCになります。
この書き方は今までやったことがなかったんですが、たまたま「並び替えの際にNULLのデータは常に上に来ないようにしてほしいんだけど」的なことを言われまして、そういや昇順の時にNULLを後ろに持ってくような書き方ってできないのかなあと思って調べたら、思ったよりも簡単にできました。
良かったらお試しあれ。
でも仕様によっては昇順でソートしつつNULLのデータは後ろに持っていきたいという場合もあると思います。
そんな時はどう書くか。結論だけ先に言うとこんな感じのSELECT文を書けば昇順で並び替えつつNULLのデータを後ろに持っていくことができます。
SELECT * FROM table ORDER BY column IS NULL ASC, column ASC
例えばこんな感じのデータが入ったテーブルがあるとします。
+----+-------------+--------+------+---------------------+
| id | category_id | title | text | created |
+----+-------------+--------+----------------------------+
| 1 | 1 | title1 | text | 2022-01-01 12:00:00 |
| 2 | 2 | title2 | text | 2022-01-02 12:00:00 |
| 3 | NULL | title3 | text | 2022-01-03 12:00:00 |
| 4 | 3 | title4 | text | 2022-01-04 12:00:00 |
| 5 | 1 | title5 | text | 2022-01-05 12:00:00 |
| 6 | NULL | title6 | text | 2022-01-06 12:00:00 |
+----+-------------+--------+------+---------------------+
カテゴリーのIDを紐づけたブログ記事のデータみたいなものをイメージです。
このデータに対して単純にカテゴリーIDでソートするとこんな感じになります。
SELECT * FROM table ORDER category_id ASC
+----+-------------+--------+------+---------------------+
| id | category_id | title | text | created |
+----+-------------+--------+----------------------------+
| 3 | NULL | title3 | text | 2022-01-03 12:00:00 |
| 6 | NULL | title6 | text | 2022-01-06 12:00:00 |
| 1 | 1 | title1 | text | 2022-01-01 12:00:00 |
| 5 | 1 | title5 | text | 2022-01-05 12:00:00 |
| 2 | 2 | title2 | text | 2022-01-02 12:00:00 |
| 4 | 3 | title4 | text | 2022-01-04 12:00:00 |
+----+-------------+--------+------+---------------------+
NULLのデータが先に来ます。
でも先ほど書いた方法でソートするとこうなります。
SELECT * FROM table ORDER category_id IS NULL ASC, category_id ASC
+----+-------------+--------+------+---------------------+
| id | category_id | title | text | created |
+----+-------------+--------+----------------------------+
| 1 | 1 | title1 | text | 2022-01-01 12:00:00 |
| 5 | 1 | title5 | text | 2022-01-05 12:00:00 |
| 2 | 2 | title2 | text | 2022-01-02 12:00:00 |
| 4 | 3 | title4 | text | 2022-01-04 12:00:00 |
| 3 | NULL | title3 | text | 2022-01-03 12:00:00 |
| 6 | NULL | title6 | text | 2022-01-06 12:00:00 |
+----+-------------+--------+------+---------------------+
IDの入ったデータは通常通り昇順でソートされ、IDがNULLのデータは後ろに来ていますね。
ASCは省略しても大丈夫です。ORDER BY句はASCやDESCを省略した場合は自動的にASCになります。
この書き方は今までやったことがなかったんですが、たまたま「並び替えの際にNULLのデータは常に上に来ないようにしてほしいんだけど」的なことを言われまして、そういや昇順の時にNULLを後ろに持ってくような書き方ってできないのかなあと思って調べたら、思ったよりも簡単にできました。
良かったらお試しあれ。