2010-11-01 11 views
47

Tengo la siguiente consulta MySQL:MySQL columna desconocida en la cláusula EN

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 

Y estoy recibiendo este error:

# 1054 - la columna Desconocido 'p.id' en 'en la cláusula '

Por lo que puedo ver, la consulta se ve bien, ¿alguna idea de lo que podría estar mal?

+0

Estoy seguro de que lo ha marcado, pero tiene una columna 'id' on table' property' que tiene un alias como p? –

Respuesta

84

No mezcle las uniones de estilo ANSI-89 y ANSI-92. Tienen una precedencia diferente que puede conducir a errores confusos, y eso es lo que sucedió aquí. Su consulta se interpreta de la siguiente manera:

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

En lo anterior, las uniones usando la palabra clave JOIN se evalúan primero antes de que el estilo de coma unión es incluso considerado. En ese momento, la tabla p aún no ha sido declarada.

Desde el MySQL manual:

However, the precedence of the comma operator is less than of INNER JOIN, CROSS JOIN, LEFT JOIN, and so on. If you mix comma joins with the other join types when there is a join condition, an error of the form Unknown column 'col_name' in 'on clause' may occur. Information about dealing with this problem is given later in this section.

lo recomiendo siempre utilizando ANSI-92 une el estilo, es decir, utilizando la palabra clave 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 

relacionadas:

+0

No hay terminología como "implícita" o "explícita" con respecto a la sintaxis JOIN. –

+5

Excelente respuesta. Esto solucionó el problema de inmediato y además me dio información adicional que me ayudará la próxima vez. Gracias Mark. –

0

Me topé con esta columna de error desconocido, la diferencia es que la consulta se genera a través de HQL dentro de session.executeQuery ("select id, name, sum (paid), custType from cust group by brand") es por eso que tener que escribir manualmente la combinación interna o la palabra clave join no es una opción, ya que el hql es el que la genera. produce una sumthing consulta como esta:

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

que dice la columna "c.custTypeId desconocido" cuando estoy 101% seguro de que tiene esa columna.

Mis clases/relaciones:

Customer { 
Integer custId 
CustomerType custType 
} 

CustomerType{ 
Integer custTypeId 
string code 
} 

el problema radica en la coma en "a partir del cliente custType" línea. debería ser con la palabra UNIR como la respuesta indicada anteriormente. pero como es HQL y está siendo generado, no puedo hacer eso. Lo que hice fue modificado por la consulta y en lugar de escribir select custType, escribí select custType.id, custType.code

Sé que es básico, pero para los principiantes como yo, fue una lucha.

7

Como se mencionó anteriormente, existe un problema de precedencia mediante el uso de combinaciones a través del operador de coma donde se ejecutará LEFT JOIN, por lo que las referencias a alias de tabla no existirán en ese momento. Aunque se puede decir implícitamente MySQL para utilizar un JOIN a través de esa declaración también puede decirle a MySQL para evaluar la coma se unió a las tablas en primer lugar, a continuación, ejecutar izquierda unirse de esta manera:

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 

Aviso las tablas separados por comas están contenidas dentro de paréntesis() . Los alias y columnas de la tabla ahora estarán disponibles para sus otras UNIONES.

Cuestiones relacionadas