60

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

クエリが正しく見える限り、何が間違っている可能性がありますか?

4

3 に答える 3

107

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、LEFTJOINなどよりも低くなります。結合条件があるときに他の結合タイプとコンマ結合を混在させると、「on句」の「不明な列」の形式のエラーが発生する可能性があります。この問題への対処に関する情報は、このセクションの後半に記載されています。

常に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

関連している:

于 2010-11-01T00:53:26.687 に答える
14

前に述べたように、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で使用できるようになります。

于 2014-11-06T16:24:57.507 に答える
1

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

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

「不明なc.custTypeId」列が101%あると確信している場合は、「unknownc.custTypeId」列と表示されます。

私のクラス/関係:

Customer {
Integer custId
CustomerType custType
}

CustomerType{
 Integer custTypeId
string code
}

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

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

于 2013-09-11T03:59:26.440 に答える