Maison > base de données > tutoriel mysql > Pourquoi ma requête MySQL génère-t-elle une erreur « Colonne inconnue dans la clause ON » et comment puis-je la corriger ?

Pourquoi ma requête MySQL génère-t-elle une erreur « Colonne inconnue dans la clause ON » et comment puis-je la corriger ?

DDD
Libérer: 2025-01-13 07:04:41
original
745 Les gens l'ont consulté

Why Does My MySQL Query Produce an

Erreur MySQL « Colonne inconnue dans la clause ON » : une solution complète

Rencontrer l'erreur « Colonne inconnue 'columnName' dans 'ON clause'" dans MySQL peut être frustrant. Cette erreur se produit lorsqu'une opération de jointure fait référence à une colonne que la base de données ne trouve pas. Disséquons la cause et apportons une solution.

L'erreur indique généralement un problème avec la syntaxe de jointure. Examinons un exemple de requête :

<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

Le problème principal ici est un mélange de styles de jointure : la jointure séparée par des virgules (property p, propertygeometry pg) est l'ancien style ANSI-89, tandis que les jointures suivantes utilisent la syntaxe ANSI-92 JOIN moderne. Cette incohérence dans le style de jointure entraîne un comportement inattendu et l'erreur.

ANSI-89 (virgule) contre ANSI-92 (JOIN) Jointures

MySQL prend en charge les jointures ANSI-89 (style virgule) et ANSI-92 (JOIN mot-clé). Cependant, leur priorité diffère, ce qui rend problématique l’utilisation mixte. Le mot-clé JOIN a une priorité plus élevée, ce qui amène la base de données à mal interpréter la relation entre les tables lorsqu'elle est combinée avec des jointures par virgules.

La solution : des jointures ANSI-92 cohérentes

Pour résoudre ce problème, utilisez systématiquement la syntaxe ANSI-92 JOIN pour toutes les jointures de votre requête. Voici la version corrigée :

<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 utilisant une syntaxe JOIN uniforme, vous éliminez toute ambiguïté et vous assurez que la base de données interprète correctement les conditions de jointure, résolvant ainsi l'erreur « Colonne inconnue dans la clause ON ». Cette approche favorise un code SQL plus clair et plus maintenable.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal