気軽に読めるPHP入門書・PHPスクリプトが動かないときの原因と対策などを紹介します。

  1. PHPエラーの原因と対策
  2. 77 view

SQLのORDER BYによるソート結果がおかしいとき(文字付きの連番)

良いか悪いかは別にして、1から始まる番号に文字を付加してA1、A2、… A10 … A20のような番号を入力することもあります。たとえば、次のnoフィールドのようなイメージです。

連番に文字を付加したフィールド

連番に文字を付加したフィールド

このフィールドは文字列なので、noフィールドを基準にソートすると意図しない結果になります。

ソート結果が意図と違う

ソート結果が意図と違う

どうすれば良いか誰かに質問すると、おそらく「桁をそろえて入力しましょう」という答えが返ってくるでしょう。

とはいえ、入力し直せない事情もあるでしょうから、ここではデータはそのままにして、noフィールドを加工してソートする方法を紹介します。

※以下、MySQLの例です。他のデータベースでは使える関数が異なる場合があるので、適宜、読み替えてください。

A1、A2、… A10 … A20を桁をそろえるイメージは次のようになります。

A1 → 001
A2 → 002
A10 → 010
A20 → 020

このように先頭の文字を削除して数値の桁数をそろえれば、うまくソートできそうです。能書きが長くなるので、実行するSQLと実行結果を先に見せます。

SELECT * 
FROM table3
ORDER BY RIGHT( CONCAT(  '00', SUBSTRING( no, 2 ) ) , 3 ) 

これにより、noフィールドは意図した順にソートされます。

番号順にソートされる

番号順にソートされる

使ったMySQL関数について

ここで使った関数について簡単に説明します。

処理の意図は、

  1. A1、A10の「A」を取り除く
  2. 1、10の前にゼロを付加して001、010のように桁をそろえる

です。

そのため次の関数を使っています。

  1. SUBSTRING関数 — 文字列の一部を取得する(ここでは、2文字目以降を取得)
  2. CONCAT関数 — 文字列を結合する(ここでは、先頭に「00」を付加)
  3. RIGHT関数 — 文字列を右からX文字取得する(ここでは、桁をそろえる)

この関数によりA10は次のように加工されます。

  1. A10 — SUBSTRING(‘A10’, 2)により、「10」になる
  2. 10 — CONCAT(’00’, SUBSTRING(‘A10’, 2))により、「0010」になる
  3. 0010 — RIGHT(CONCAT(’00’, SUBSTRING(‘A10’, 2)), 3)により、「010」になる

これにより、A1、A2、… A10 … A20のような文字付きの連番から桁数のそろった数値が作成されます。

PHPエラーの原因と対策の最近記事

  1. PHPの関数や変数の前にあるアットマークの意味は?

  2. 「http:// wrapper is disabled in the server co…

  3. php.iniの場所

  4. 「Warning: array_key_exists()」と表示されるとき

  5. 「Warning: A non-numeric value encountered」と表示…

関連記事

PAGE TOP