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
Libérer: 2025-01-13 09:58:43
original
171 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal