1. ホーム
  2. sql

[解決済み] MySQLのON句の不明なカラム

2022-02-06 14:52:45

質問

次のようなMySQLのクエリがあります。

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

そして、こんなエラーが出ました。

#1054 - 'on 節' にある 'p.id' という列が不明です。

クエリが正しいように見えるのですが、何が間違っているのでしょうか?

解決方法は?

ANSI-89形式とANSI-92形式の結合を混在させないでください。これらは優先順位が異なるため、混乱したエラーにつながる可能性があり、今回もそうなっています。クエリーは次のように解釈されます。

FROM property p, (
    propertygeometry pg
    JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
    ...
)

上記では、カンマ形式の結合が考慮される前に、JOINキーワードを使用した結合が最初に評価されます。その時点でテーブル p はまだ宣言されていない。

から MySQLマニュアル :

ただし、カンマ演算子の優先順位は、INNER JOIN、CROSS JOIN、LEFT JOINなどよりも低くなっています。結合条件があるときにカンマ結合と他の結合型を混在させると、次のようなエラーが発生します。 on節」の不明な列「col_name」。 が発生することがあります。この問題への対処については、このセクションの後半で説明します。

おすすめは 常に ANSI-92スタイルの結合、つまりJOINキーワードを使用することです。

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

関連する