目次

目次

MySQL の ORDER BY 句でカラムの別名が使えない

アバター画像
江藤 光
アバター画像
江藤 光
最終更新日2017/08/24 投稿日2017/08/24

開発で下記のようなSQLを書きました。

SELECT
     orders.credit_order_id         AS "受注番号",
     goods.goods_name               AS "商品名",
     goods.goods_id                 AS "商品コード"
 FROM orders
 (略)
 ORDER_BY "受注番号"

受注番号でソートされた結果が返ってくると思っていたのですが実際の結果は

|14641806477310300000000004 | ポストカード | dummy-0000000123|
|14786037475918900000000644 | ポストカード | dummy-0000000123|
|14663139217720500000000006 | ポストカード | dummy-0000000123|
|14661488886492500000000046 | ポストカード | dummy-0000000123|
|14651332683516000000000004 | ポストカード | dummy-0000000123|
|14637111489780600000000006 | ポストカード | dummy-0000000123|
|14788581321243100000000659 | ポストカード | dummy-0000000123|
|14770469711138300000000514 | ポストカード | dummy-0000000123|
|14663098973620600000000006 | ポストカード | dummy-0000000123|
|14661486044897700000000046 | ポストカード | dummy-0000000123|
(略)

(すこし分かりにくいですが、)受注番号でソートされていません。 受注番号でソートするにはどうすればいいのでしょうか?


検索して出てきた個人ブログを何件か見てみると、ORDER_BY 句のクオートを外すと動くという記述を見つけました。 試してみます。

SELECT
     orders.credit_order_id         AS "受注番号",
     goods.goods_name               AS "商品名",
     goods.goods_id                 AS "商品コード"
 FROM orders
 (略)
 ORDER_BY 受注番号
|14633694676398300000000004 | ポストカード | dummy-0000000123|
|14637111489780600000000006 | ポストカード | dummy-0000000123|
|14641806477310300000000004 | ポストカード | dummy-0000000123|
|14649450863032600000000004 | ポストカード | dummy-0000000123|
|14651332683516000000000004 | ポストカード | dummy-0000000123|
|14654399622344800000000004 | ポストカード | dummy-0000000123|
|14661486044897700000000046 | ポストカード | dummy-0000000123|
|14661488886492500000000046 | ポストカード | dummy-0000000123|
|14662951280217000000000006 | ポストカード | dummy-0000000123|
|14663098973620600000000006 | ポストカード | dummy-0000000123|
(略)

おお!確かに受注番号でソートされました。 が、どうしてなのでしょう…?


さらに調べてみました。 MySQL公式ドキュメントのカラムエイリアスに関する問題というページに原因が書かれていました。

ステートメント内のどこに指定する場合でも、エイリアスへの引用した参照には、識別子引用符を使用する必要があります。そうしないと、参照は文字列リテラルとして扱われます。たとえば、次のステートメントはカラム id の値によってグループ化され、エイリアス `a` を使用して参照されます。
SELECT id AS 'a', COUNT(*) AS cnt FROM tbl_name
  GROUP BY `a`;

要するに「ORDER BY や GROUP BY でカラムの別名を指定する時はクオートじゃなくてバッククオートで囲む。そうでないとカラム名として見てもらえない」ということみたいです。 クオートを外したときに動いたのは… MySQL がいい感じに「察して」くれたのでしょうか? という訳で、以下のSQLがドキュメント的に正しいものになります。

SELECT
     orders.credit_order_id         AS "受注番号",
     goods.goods_name               AS "商品名",
     goods.goods_id                 AS "商品コード"
 FROM orders
 (略)
 ORDER_BY `受注番号`
アバター画像

江藤 光

まだまだ気持ちは新人です。

目次