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