どちらかと言えば、初心者がやりがちなMySQLのエラーですが、私はいまだにやらかすのでまとめ。
MySQLの構文エラーです。
エラー文はこちら。
ERROR 1052 (23000): Column ‘[カラム名]’ in order clause is ambiguous
Google翻訳にで訳すと、「order節の ‘[カラム名]’列があいまいです」とのことでした。
こちらのエラーは、JOIN を使って テーブルを結合するときに発生することがあります。
原因は、結合するテーブルの両方に存在する、同名のカラム名をソート条件で使っているためです。
例えば、下記のようなテーブルがあり、これを結合してみます。
テーブル1:profile
id | name | year | blood |
---|---|---|---|
1 | 田中 | 20 | 2 |
2 | 鈴木 | 31 | 3 |
3 | 佐藤 | 26 | 1 |
テーブル2:blood_type
id | blood_type |
---|---|
1 | A |
2 | B |
3 | O |
4 | AB |
SQL文はこのようになるかと思います。
SELECT name, year, blood_type FROM profile INNER JOIN blood_type ON profile.blood = blood_type.id;
で、このSQL文に、ソート条件として、profile テーブルの idカラムを指定したとします。
その時に、下記のように記述してしまうと、今回のエラーが発生します。
SELECT name, year, blood_type FROM profile INNER JOIN blood_type ON profile.blood = blood_type.id ORDER BY id;
単に id というカラムは、結合している blood_type テーブルにも存在しているため、どちらの id でソートするかが明記されていないためです。
そのため、下記のように修正します。
SELECT name, year, blood_type FROM profile INNER JOIN blood_type ON profile.blood = blood_type.id ORDER BY profile.id;
ソートしたいカラムがどのテーブルのものかを指定したので、問題なく実行できました。
以上、SQL文のエラーの対処法でした。
カラムが多いテーブル名を扱うときに、よくカラムが重複しているのに気づかずこのエラーに遭遇することがあります。
また、ORDER条件の時だけでなく、SELECTの後ろで取得したいカラム名を指定するときにも、重複しているカラム名を指定してしまうと、どのテーブルのカラム?と聞かれてしまうので注意しましょう。
まあ、SELECT文なので、ミスをしてもデータが消えたり、書き換えられたりすることはないので、MySQL初心者でも恐れずに、どんどんエラーを発生させて対処法を学びましょう。