MySQLのソートで空白の行を下げようとしたらハマった話

2016.04.26

MySQLのソートで少々ハマりました。同じ間違いをしない為に記録しておきます。


やりたかった事

以下のようなデータがあったとしましょう。

+----+--------+------+------------------+
| id | name   | age  | code             |
+----+--------+------+------------------+
|  1 | Taro   | 25   | bx8m9xfhx7med7ep |
|  2 | Jiro   | 25   | hitnskx5kcx8cswf |
|  3 | Saburo | 25   |                  |
|  4 | Siro   |      | dddtwr6ses7ih2ai |
|  5 | Goro   |      |                  |
|  6 | Roro   | 26   |                  |
+----+--------+------+------------------+

期待していたソート条件は以下の通り。上から下へ優先順位が下がります。

  • カラム「age」と「code」にデータが入っている
  • カラム「age」にデータが入っていて「code」は空
  • カラム「code」にデータが入っていて「age」は空
  • カラム「id」昇順

求めていた結果にならない

求めていたソート条件を反映して、以下のSELECT文を書きました。

select * from emp order by age DESC ,code DESC, id;

そして得られた結果が以下になります。

+----+--------+------+------------------+
| id | name   | age  | code             |
+----+--------+------+------------------+
|  6 | Roro   | 26   |                  |
|  2 | Jiro   | 25   | hitnskx5kcx8cswf |
|  1 | Taro   | 25   | bx8m9xfhx7med7ep |
|  3 | Saburo | 25   |                  |
|  4 | Siro   |      | dddtwr6ses7ih2ai |
|  5 | Goro   |      |                  |
+----+--------+------+------------------+

こうやって整理しながら書くと、なぜ間違ったのかが不思議なほど単純なミスです。慌てていると何故か見落とすんですよね。

空文字を最後にする

求めていたソート結果を得る為に必要な条件は、ageとcodeの空文字を下げる事でした。なので、正解は以下の条件になります。

select * from emp order by age = "" ,code = "", id;

これで空文字が下がります。以上のSQLにより、求めていた結果が得られました。

+----+--------+------+------------------+
| id | name   | age  | code             |
+----+--------+------+------------------+
|  1 | Taro   | 25   | bx8m9xfhx7med7ep |
|  2 | Jiro   | 25   | hitnskx5kcx8cswf |
|  3 | Saburo | 25   |                  |
|  6 | Roro   | 26   |                  |
|  4 | Siro   |      | dddtwr6ses7ih2ai |
|  5 | Goro   |      |                  |
+----+--------+------+------------------+

ちなみに、今回は空文字を下げましたがNULLを下げたいなら以下のように書きます。

select * from emp order by age is null ,code is null, id;

いやぁ、お恥ずかしい。以上、MySQLのOrderByで空文字を下げる方法でした。


関連する記事

CATEGORY

ARCHIVE

NEW