MySQL クエリでの「不明な列」エラー
MySQL では、結合を含むクエリを実行すると、「ON 句に不明な列 'p.id'」エラーが発生することがあります。このエラーの原因を理解するために、クエリとそのデータベース解釈を詳しく調べてみましょう。
クエリの説明:
問題のクエリは次のようになります:
<code class="language-sql">SELECT p.*, IF(COUNT(ms.PropertyID) > 0,1,0) AS Contacted, pm.MediaID, date_format(p.AvailableFrom, '%d %b %Y') AS 'AvailableFrom', astext(pg.Geometry) AS Geometry FROM property p, propertygeometry pg JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216 LEFT JOIN message ms ON ms.PropertyID = p.id AND ms.SenderID = 384216 LEFT JOIN property_media pm ON pm.PropertyID = p.id AND pm.IsPrimary = 1 WHERE p.paused = 0 AND p.PropertyGeometryID = pg.id GROUP BY p.id</code>
このエラーは、ANSI-89 スタイルの結合と ANSI-92 スタイルの結合が混在していることが原因で、あいまいさが生じる可能性があります。 ANSI-89 構文では結合はカンマで表されますが、ANSI-92 では JOIN キーワードが使用されます。
エラーの説明:
データベースはクエリを次のように解釈します:
<code class="language-sql">FROM property p, ( propertygeometry pg JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216 ... )</code>
この解釈では、テーブル p は、propertygeometry pg とのカンマ区切り結合の前に宣言されていません。したがって、データベースは後続の結合で ON 条件を評価するときに列 p.id を見つけることができません。
解決策:
このエラーを回避するには、常に ANSI-92 スタイルの結合を使用することをお勧めします。この場合、すべての結合は JOIN キーワードによって明示的に行われます。
<code class="language-sql">SELECT p.*, IF(COUNT(ms.PropertyID) > 0,1,0) AS Contacted, pm.MediaID, date_format(p.AvailableFrom, '%d %b %Y') AS 'AvailableFrom', astext(pg.Geometry) AS Geometry FROM property p JOIN propertygeometry pg ON p.PropertyGeometryID = pg.id JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216 LEFT JOIN message ms ON ms.PropertyID = p.id AND ms.SenderID = 384216 LEFT JOIN property_media pm ON pm.PropertyID = p.id AND pm.IsPrimary = 1 WHERE p.paused = 0 GROUP BY p.id</code>
一貫した結合構文を採用することで、あいまいさを回避し、今後のクエリで同様のエラーが発生するのを防ぐことができます。
以上がMySQL クエリで「'on 句' の不明な列 'p.id'」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。