Coluna desconhecida do MySQL na cláusula ON

Eu tenho a seguinte 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 

E estou recebendo este erro:

# 1054 – Coluna desconhecida ‘p.id’ em ‘on cláusula’

Tanto quanto eu posso ver a consulta parece certa, alguma idéia do que poderia estar errado?

Não misture estilo ANSI-89 e junções de estilo ANSI-92. Eles têm precedências diferentes, o que pode levar a erros confusos, e é isso que aconteceu aqui. Sua consulta está sendo interpretada da seguinte maneira:

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

Acima, as junções usando a palavra-chave JOIN são avaliadas primeiro antes que a junit no estilo vírgula seja considerada. Nesse ponto, a tabela p ainda não está declarada.

Do manual do MySQL :

No entanto, a precedência do operador vírgula é menor que INNER JOIN, CROSS JOIN, LEFT JOIN e assim por diante. Se você combinar vínculos de vírgula com os outros tipos de associação quando houver uma condição de associação, poderá ocorrer um erro no formulário Coluna desconhecida ‘col_name’ em ‘on cláusula’ . Informações sobre como lidar com esse problema são fornecidas mais adiante nesta seção.

Eu recomendaria sempre usar junções no estilo ANSI-92, ou seja, usando a palavra-chave 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:

  • Por que o padrão SQL ANSI-92 é melhor adotado em relação ao ANSI-89?

Como dito antes, há um problema de precedência usando junções através do operador de vírgula onde o LEFT JOIN será executado e, portanto, as referências a alias de tabela não existirão naquele momento. Embora você possa implicitamente dizer ao MySQL para usar um JOIN por meio dessa instrução, você também pode dizer ao MySQL para avaliar primeiro as tabelas unidas por vírgula, e então executar a junit à esquerda desta forma:

 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 as tabelas separadas por vírgulas estão contidas dentro de parênteses (). Os aliases e colunas de tabela agora estarão disponíveis para seus outros JOINs.

Eu esbarrei nesta coluna de erro desconhecido, o diff é a consulta é construída através de HQL dentro session.executeQuery (“selecionar id, nome, sum (pago), custType do grupo cust por marca”) é por isso que digitar manualmente ingresso interno ou join keyword não é uma opção, já que o hql é o gerador dela. Ele produz uma consulta sumthing como esta:

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

ele diz coluna “c.custTypeId desconhecido” quando tenho 101% de certeza de que ele tem essa coluna.

Minhas aulas / relações:

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

o problema está na vírgula na linha “from customer, custType”. deve ser com a palavra JOIN como a resposta indicada acima. mas como é HQL e está sendo gerado, não posso fazer isso. O que eu fiz é modificado por consulta e em vez de digitar select custType, eu digitei select custType.id, custType.code

Eu sei que é básico, mas para os novatos como eu, foi uma luta.