web-dev-qa-db-ja.com

ON句のMySQL不明な列

次の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」

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

54

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'」という形式のエラーが発生する場合があります。この問題への対処に関する情報は、このセクションで後述します。

always 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

関連:

95
Mark Byers

前に述べたように、LEFT JOINが実行されるコンマ演算子を介した結合を使用する優先順位の問題があるため、その時点ではテーブルエイリアスへの参照は存在しません。そのステートメントを介して暗黙的にMySQLにJOINを使用するように指示することもできますが、最初にコンマ結合テーブルを評価してから左結合を実行するように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

コンマ区切りのテーブルが括弧()内に含まれていることに注意してください。これで、他のJOINがテーブルのエイリアスと列を使用できるようになります。

10
Tom Mulkins

私はこのエラーの不明な列にぶつかりました.diffはクエリがsession.executeQuery( "select id、name、sum(paid)、custType from cust group by brand")内でHQLを介して構築されているため、手動で内部結合を入力するか、 joinキーワードは、hqlが生成するため、オプションではありません。次のようなクエリサミングが生成されます。

select cust_id, name, sum(paid), c.custTypeId
from customer c, custType ct
on c.custTypeId  = ct.custTypeId 

「unknown c.custTypeId」列には、その列が含まれていることが101%確信していると表示されます。

私のクラス/関係:

Customer {
Integer custId
CustomerType custType
}

CustomerType{
 Integer custTypeId
string code
}

問題は「from customer、custType」行のコンマにあります。上記の答えとしてWord JOINを使用する必要があります。しかし、それはHQLであり、生成されているため、それはできません。私がしたことはクエリによって変更され、select custTypeを入力する代わりに、select custType.id, custType.code

私はそれが基本的なことを知っていますが、私のような最初のタイマーにとっては、それは苦労でした。

1
user742102