MySQLでHAVING指定したら「Unknown column … in ‘having clause’」エラー
ん! あなたは…ズバリ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は大体覚えてきたな…と思ったところで突然こういった壁がデン!と出てくるのがデータベースの怖さですね。 しっかり学んでおきましょう。
2011-01-06