Erreur "Colonne inconnue" dans la requête MySQL
Dans MySQL, vous pouvez rencontrer une erreur « Colonne inconnue 'p.id' dans la clause ON » lors de l'exécution de requêtes impliquant des jointures. Pour comprendre la cause de cette erreur, examinons la requête et son interprétation dans la base de données.
Explication de la requête :
La requête en question ressemble à ceci :
<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>
Cette erreur est due au mélange des jointures de style ANSI-89 et ANSI-92, ce qui peut conduire à une ambiguïté. Dans la syntaxe ANSI-89, les jointures sont représentées par des virgules, tandis qu'en ANSI-92, le mot-clé JOIN est utilisé.
Description de l'erreur :
La base de données interprète la requête comme suit :
<code class="language-sql">FROM property p, ( propertygeometry pg JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216 ... )</code>
Dans cette interprétation, la table p n'est pas déclarée avant la jointure séparée par des virgules avec propertygeometry pg. Par conséquent, la base de données ne peut pas trouver la colonne p.id lors de l'évaluation de la condition ON dans les jointures suivantes.
Solution :
Pour contourner cette erreur, il est recommandé de toujours utiliser des jointures de style ANSI-92, où toutes les jointures sont rendues explicites par le mot-clé 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>
En adoptant une syntaxe de jointure cohérente, vous pouvez éviter toute ambiguïté et empêcher des erreurs similaires dans les requêtes futures.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!