Maison >base de données >tutoriel mysql >Pourquoi est-ce que je reçois une erreur « Colonne inconnue 'p.id' dans 'on clause' » dans ma requête MySQL ?

Pourquoi est-ce que je reçois une erreur « Colonne inconnue 'p.id' dans 'on clause' » dans ma requête MySQL ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-13 09:58:43171parcourir

Why am I getting an

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn