MySQLでHAVING指定したら「Unknown column ... in 'having clause'」エラー
presented by 役に立つかもしれないBlog
ん! あなたは...ズバリMySQLの動作に戸惑っている最中ですね?
しかもHAVING句のやっかいさに...。 私もそうでした。苦笑
HAVING句はグループ化された結果に対してさらに条件で絞り込み等を行える便利な命令ですが、ちょっとした癖があります。
それは「テーブル名指定をエラーとして認識してしまうこと」です。
間違いの例
よく、複数のテーブルを参照したりした場合に、SELECTするデータを「テーブル名.フィールド」として取得することがありますね?
たとえば、各ユーザーがポストしたメッセージのうち、最新のものが2011年以降のものになるように絞り込んでSELECTしたい時なんかは次のように書いたりします。
SELECT MAX(message.posted) FROM user,message WHERE user.userid=message.userid GROUP BY message.userid HAVING message.poted > 20110101000000
うん、SELECTしているデータに対して、適切に日付で絞り込んでる。 一見間違いなさそうなクエリに見えます。 ところが...
#1054 - Unknown column 'message.posted' in 'having clause'
そんなデータ列知らないよと。。 どうもHAVING句ではテーブル名を付けたフィールド指定を受け付けてくれないようです。
AS句を使って解決
こういう場合は「AS」句を使って、「テーブル名.フィールド名 AS 別名」にしてシンプルな単語にしてしまいましょう。
SELECT MAX(message.posted) AS m_posted FROM user,message WHERE user.userid=message.userid GROUP BY message.userid HAVING m_poted > 20110101000000
MySQLは大体覚えてきたな...と思ったところで突然こういった壁がデン!と出てくるのがデータベースの怖さですね。 しっかり学んでおきましょう。
このページに関連のある記事はこちら
- MySQLサーバーでクエリ履歴をログファイルに保存する方法
- プログラマーが「『超』入門 失敗の本質」を読んでみた。
- 勝手に英文をツイートされてしまうハッキング事例が多数発生中!
- MySQLで「ALTER TABLE ... DROP INDEX」すると「Error 150」が出る問題
- タグ機能を実現するための便利なデータベース設計を3つ紹介
- PowerPointでPDF書き出し時のテキストが消える問題と解決法
- さくらのVPSのPHP+MySQLを最新のものにアップデート。
- JavaScriptでDATETIME型の日付を得る方法
- MySQL(innoDB)でリレーション設定時に「インデックスは設定されていません」エラー
- MySQLでRANDOMな数値を得る方法
- MySQLのunique属性で大文字や小文字が区別されない問題を解決



コメントフォーム