Frage

Ich habe folgende MySQL-Abfrage:

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

Und ich bin immer diese Fehlermeldung:

# 1054 - Unknown column 'p.id' in 'on-Klausel'

Soweit ich die Abfrage sieht richtig sehen kann, eine Ahnung, was falsch sein könnte?

War es hilfreich?

Lösung

Do not mix ANSI-89-Stil und ANSI-92-Stil verbinden. Sie haben unterschiedliche Priorität, die zu verwirrend Fehlern führen kann, und das ist, was hier passiert ist. Ihre Anfrage wird interpretiert wird, wie folgt:

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

In der oben schließt sich die mit den JOIN sind Keyword ausgewertet erst vor dem Komma-Stil Join wird auch in Betracht gezogen. An diesem Punkt wird die Tabelle p noch nicht erklärt.

Von der MySQL-Handbuch :

  

Allerdings ist der Vorrang des Komma-Operator kleiner als der INNER JOIN, CROSS JOIN LEFT JOIN, und so weiter. Wenn Sie Typen Komma verbindet sich mit dem anderes vermischen beitreten, wenn es eine Join-Bedingung ist, ein Fehler der Form Unbekannte Spalte ‚col_name‘ in ‚on-Klausel‘ auftreten kann. Informationen über Umgang mit diesem Problem wird später in diesem Abschnitt.

Ich würde empfehlen, immer mit ANSI-92-Stil verbindet, das heißt mit dem Schlüsselwort 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

Siehe auch:

Andere Tipps

Wie bereits erwähnt, bevor es ein Vorrang Problem ist, schließt sich über den Komma-Operator, wo die LEFT JOIN wird ausgeführt und so Verweise auf Tabellen-Aliases existiert zu diesem Zeitpunkt nicht. Obwohl Sie implizit MySQL sagen können, eine über diese JOIN-Anweisung zu verwenden, können Sie auch MySQL anweisen, das Komma zu bewerten verknüpften Tabellen zuerst, dann links ausführen beitreten thusly:

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

Beachten Sie trennte sich die Komma-Tabellen in Klammern enthalten sind (). Die Tabellen-Aliases und Spalten werden nun zur Verfügung, um Ihre anderen beitritt.

stieß ich auf diesen Fehler unbekannt Spalte, die diff die Abfrage wird durch HQL innerhalb session.executeQuery gebaut ( „select id, name, sum (gegen Entgelt), CUSTTYPE von cust Gruppe von Marke“), deshalb manuell Typ mit innere Verknüpfung oder steig Schlüsselwort ist keine Option, da die HQL derjenige es Erzeugen. es erzeugt eine Abfrage sumthing wie folgt aus:

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

es heißt "unknown c.custTypeId" -Spalte, wenn ich bin 101% sicher, trägt es, dass Spalte.

Meine Klassen / Beziehungen:

Customer {
Integer custId
CustomerType custType
}

CustomerType{
 Integer custTypeId
string code
}

Das Problem liegt in dem Komma in "von Kunden, CUSTTYPE" -Zeile. es sollte oben angegebenen JOIN als Antwort mit dem Wort sein. aber da es HQL ist und erzeugt wird, kann ich das nicht tun. Was ich tat, wird durch Abfrage geändert und statt Tippen auswählen CUSTTYPE, ich getippt select custType.id, custType.code

Ich weiß, es ist aber grundlegend für die ersten Timer wie mich, es war ein Kampf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top