Pergunta

Depois de 5.0.12 MySQL mudou a sintaxe para esquerda junta-se para coincidir com SQL2003 standard. Então

... FROM t1 , t2 LEFT JOIN t3 ON (expr)

precisa ser reescrita como

... FROM (t1 , t2) LEFT JOIN t3 ON (expr

ou então ele será analisado como ... FROM t1 , (t2 LEFT JOIN t3 ON (expr))

Agora, eu tenho um aplicativo antigo que eu estou portando a partir do MySQL 3,23-5,1, eo código de idade tem essa consulta (eek!):

select b.*, c.*, g.*, p.perfname, p.persname 
from bookings b, customer c 
left join grade g on b.chrggrade=g.grcode 
left join person p on b.person=p.percode 
where complete='Y' and invoiced='N' 
and datemade between '2009-03-25' and '2009-03-31' 
and c.custcode=b.cust 
order by cust, person, tsref, stdt 

Esta falha com o erro SQL 1054, coluna desconhecida em b.chrggrade. Isso é porque ele é analisar como

selecione b. , c. , g. *, P.perfname, p.persname de reservas b, (c cliente esquerda se juntar grau g em b.chrggrade = g.grcode) esquerda se juntar pessoa p sobre b.person = p.percode onde completos = 'Y' e facturado = 'N' e datemade entre '2009-03-25' e '2009-03-31' e c.custcode = b.cust fim por cust, pessoa, tsref, STDT

eu acho.

Estou certo de suportes colocados corretamente pode corrigir isso, mas eu estou perplexo. Eu encontrei referência a esta mudança em http://bugs.mysql.com/bug.php ? id = 13551 , que mostra como corrigir um simples LEFT JOIN, mas eu ainda não pode trabalhar com isso para esta consulta. David

Foi útil?

Solução

Pare de usar a sintaxe vírgula completamente e ser explícito em suas instruções JOIN. Os sintaxe vírgula obriga a colocar a condição de junção na cláusula WHERE, que não pode ficar executado até depois esquerda / direita junta-se, dependendo de como ele é analisado. Usando explícita JOINS torna a consulta de qualquer maneira mais legível.

... FROM t1, t2 LEFT JOIN t3 ON (expr) torna-se ... FROM t1 INNER JOIN t2 ON (expr) LEFT JOIN t3 ON (expr)

Isso também vai corrigir o erro que você está vendo. A menos que não há chrggrade na tabela de reservas, então nada irá corrigir o erro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top