varios varias valores una sumar mismo misma condiciones condicion con columnas columna campo sql mysql mysql-error-1054

varias - MySQL columna desconocida en la cláusula ON



where con varias condiciones mysql (3)

Tengo la siguiente consulta MySQL:

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 obtengo este error:

# 1054 - Columna desconocida ''p.id'' en ''cláusula on''

Por lo que puedo ver, la consulta parece correcta, ¿alguna idea de lo que podría estar mal?


Como se mencionó anteriormente, existe un problema de precedencia mediante el uso de combinaciones mediante el operador de coma donde se ejecutará LEFT JOIN y, por lo tanto, las referencias a los alias de tabla no existirán en ese momento. Aunque puedes decirle implícitamente a MySQL que use un JOIN a través de esa declaración, también puedes decirle a MySQL que primero evalúe las tablas combinadas por comas, luego ejecuta left join así:

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

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


Me encontré 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 hql es la que la genera. produce una suma de consulta como esta:

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

dice "unknown c.custTypeId" cuando estoy 101% seguro de que lleva esa columna.

Mis clases / relaciones:

Customer { Integer custId CustomerType custType } CustomerType{ Integer custTypeId string code }

el problema radica en la coma en la línea "del cliente, custType". 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, select custType.id, custType.code

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


No mezcle el estilo ANSI-89 y las uniones de estilo 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 que utilizan la palabra clave JOIN se evalúan primero antes de considerar siquiera la combinación de estilo de coma. En ese punto, la tabla p aún no ha sido declarada.

Del manual de MySQL :

Sin embargo, la precedencia del operador de coma es menor que la de INNER JOIN, CROSS JOIN, LEFT JOIN, y así sucesivamente. Si mezcla comas se une con los otros tipos de unión cuando hay una condición de unión, puede producirse un error del formulario Columna desconocida ''col_name'' en ''on clause'' . La información sobre cómo lidiar con este problema se brinda más adelante en esta sección.

Recomiendo siempre usar combinaciones de estilo ANSI-92, es decir, usando 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

Relacionado: