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は大体覚えてきたな…と思ったところで突然こういった壁がデン!と出てくるのがデータベースの怖さですね。 しっかり学んでおきましょう。
コードが動かないので帰れません! 新人プログラマーのためのエラーが怖くなくなる本
¥1,980 (2025-04-26 11:19 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)エラー
¥1,505 (2025-04-26 11:19 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)エラー 失敗の法則
(2025-04-26 11:19 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)2011-01-06