開発で下記のような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 `受注番号`
江藤 光
まだまだ気持ちは新人です。