Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Elias_Maluco

Funciona no MySQL 4, mas dá erro no MySQL 5

Recommended Posts

Instalei MySQL 5.0.22 no meu PC de casa (Suse 10.0 64bit) pra terminar um trabalho que eu estava fazendo no meu trampo. Lá, está instalado o MySQL 4 (não lembro exatamente qual versão). Pra minha surpresa, estou encontrando erros inexplicáveis em querys relativamente simples.Essa query, por exemplo:

"SELECT l.*, p.*, la.livro_lancamento_id, d.destaque_id FROM livro AS l, produto AS p LEFT JOIN destaque AS d ON ((d.destaque_id = l.livro_id) AND (d.tipo = 'livro')) LEFT JOIN livro_lancamento AS la ON la.livro_id = l.livro_id WHERE l.livro_id = 14 AND p.livro_id = l.livro_id"
Funciona perfeitamente lá no meu trampo, mas aqui retorna o erro:

"#1054 - Unknown column 'l.livro_id' in 'on clause'"

Essa coluna existe sim, o erro não faz sentido. Alguém poderia me ajudar a entender isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que estranho, ainda pensei que tinha algum '1' confundido com 'l' aí no meio, mas são todos 'l' mesmo.Se existe mesmo, o erro é inexplicável. :S

Compartilhar este post


Link para o post
Compartilhar em outros sites

Elias, Se a tabela realmente existe e aparece esse erro, pode ser em função da péssima estrutura do banco. Isso ocorre quando o usuário do banco faz um backup ridículo copiando os arquivos da base de dados direto na pasta data do mysql. Isso não é correto. Provavelmente você deve ter copiado os arquivos direto da pasta data em outro computador, que utiliza o Mysql 4 e depois restaurou no seu micro colando a os arquivos na pasta data do seu Mysql que é a versão 5.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se a tabela realmente existe e aparece esse erro, pode ser em função da péssima estrutura do banco. Isso ocorre quando o usuário do banco faz um backup ridículo copiando os arquivos da base de dados direto na pasta data do mysql. Isso não é correto. Provavelmente você deve ter copiado os arquivos direto da pasta data em outro computador, que utiliza o Mysql 4 e depois restaurou no seu micro colando a os arquivos na pasta data do seu Mysql que é a versão 5.

Não, não foi assim que fiz não. Eu exportei o arquivo .sql pelo phpMyAdmin e depois importei em casa também pelo phpMyAdmin.E a tabela realmente existe, e nela tem o campo 'livro_id', quanto a isso podem ter certeza. O mais estranho é que outras querys que usam essa tabela (inclusive muito mais complexas que essas, e que também usam o campo 'livro_id') funcionam perfeitamente, só essa dá esse erro inexplicável. E essa mesma query, aplicada ao mesmo banco de dados, só que aqui no meu trampo (que usa MySQL 4.1.10a, a propósito), funciona normalmente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Niguém? Por favor galera, o caso agora ficou mais sério. Agora aqui no meu trampo o MySQL é 5 também, então essa query tá dando erro aqui também. Não faz sentido, a query tá certa, não há nada de errado nela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

estou tendo o mesmo erro mas no mysql 4.1 em uma pagina de login, quando o usuario vai fazer o login para verificar os dados no campo senha aparece o erro Unknown column 'kkkkkkk' in 'where clause', mas se eu mudar a senha do usuario e colocar somente numeros ai fica tudo em ordem !!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já tentei sem os alias, dá na mesma. Eu reecrevi a query dessa forma:

 

SELECT livro. * , produto. * , livro_lancamento_id, destaque_idFROM livro, produtoLEFT JOIN livro_lancamento USING (livro_id)LEFT JOIN destaque ON ((destaque_id = livro_id) AND (tipo = 'livro'))WHERE livro.livro_id = $this->livro_idAND produto.livro_id = livro.livro_id

Funciona. Mas não faz sentido, a outra sintaxe também é válida. Agora estou com um problema pior, nessa query:

 

SELECT pe.pedido_id AS id, pe. * , pe.numero AS pedido_numero, pe.status AS pedido_status, (CASE WHEN (pe.status = 'EM ANDAMENTO'AND pa.status = 'AGUARDANDO'AND e.status = 'NAO-ENVIADO')THEN 'Aguardando pagto.'WHEN (pe.status = 'EM ANDAMENTO'AND pa.status = 'PAGO'AND e.status = 'NAO-ENVIADO')THEN 'Aguardando envio'WHEN (pe.status = 'EM ANDAMENTO'AND pa.status = 'PAGO'AND e.status = 'ENVIADO')THEN 'Enviado'WHEN (pe.status = 'EM ANDAMENTO'AND pa.status = 'PAGO'AND e.status = 'ENTREGUE')THEN 'Recebido'WHEN (pe.status = 'EM ANDAMENTO'AND (e.status = 'RECUSADO'OR e.status = 'DEVOLVIDO'))THEN 'Envio fracassado'WHEN (pe.status = 'FINALIZADO')THEN 'Finalizado'WHEN (pe.status = 'CANCELADO-LOJA')THEN 'Cancelado por nós'WHEN (pe.status = 'CANCELADO-CLIENTE')THEN 'Cancelado pelo cliente'END) AS status_label, ca. * , ca.tipo AS pessoa_tipo, DATE_FORMAT( pe.time_ini, '%d/%m/%Y' ) ASDATA , e. * , en. * , pa. * , pa.status AS pag_status, e.status AS env_status, e.tipo AS env_tipo, DATE_FORMAT( pa.time_pag, '%d/%m/%Y' ) AS data_pag, DATE_FORMAT( e.time_envio, '%d/%m/%Y' ) AS data_envio, DATE_FORMAT( e.time_envio, '%h:%i:%s' ) AS hora_envio, CONCAT( t.descricao, ' ', IFNULL( f.fpag_desc, i.descricao ) ) AS forma_pagFROM pedido AS pe, pedido_pagamento AS pa, pedido_envio AS e, cadastro AS ca, endereco AS en, forma_pagamento AS f, instituicao AS i, forma_pagamento_tipo AS t,LEFT JOIN trans_redecard AS tr ON ( tr.pedido_id = pe.pedido_id )WHERE pe.pedido_id =1AND pe.pedido_id = pa.pedido_idAND pe.pedido_id = e.pedido_idAND pe.cadastro_id = ca.cadastro_idAND en.endereco_id = e.endereco_idAND f.forma_pagamento_id = pa.forma_pagamento_idAND f.instituicao_id = i.instituicao_idAND f.forma_pagamento_tipo_id = t.forma_pagamento_tipo_idLIMIT 0 , 50

O query funciona beleza sem o "LEFT JOIN trans_redecard AS tr". Não dá pra entender. E dessa vez não funciona nem se uso "LEFT JOIN trans_redecard AS tr USING( pe.pedido_id)", ou "LEFT JOIN trans_redecard USING(pedido_id)", etc. Agora, se eu uso simplesmente:

 

FROM pedido AS pe, pedido_pagamento AS pa, pedido_envio AS e, cadastro AS ca, endereco AS en, forma_pagamento AS f, instituicao AS i, forma_pagamento_tipo AS t, trans_redecard AS tr WHERE pe.pedido_id =1 AND tr.pedido_id = pe.pedido_id

Aí funciona. Mas eu preciso que seja LEFT JOIN (desse jeito é INNER). Mais uma vez, a query (com LEFT JOIN) funciona perfeitamente no mysql 4.xx. A maior besteira que minha empresa fez foi esse upgrade pra mysql 5, só deu dor de cabeça.

Compartilhar este post


Link para o post
Compartilhar em outros sites

precisaria da estrutura das tabelas, alguns dados de exemplo para simular e debugar o erro.. assim não consegui entender realmente...

 

e sobre a versão nova, tem muitos novos recursos.. não vale a pena voltar para a 4... mas se for essa a alternativa...

http://dev.mysql.com/doc/refman/5.0/en/dow...ing-to-4-1.html

 

mas faça mais este teste:

SELECT L.*, p.*, LA.livro_lancamento_id, d.destaque_id FROM livro AS LINNER JOIN produto AS p ON p.livro_id = L.livro_idLEFT OUTER JOIN destaque AS d ON ((d.destaque_id = L.livro_id) AND (d.tipo = 'livro')) LEFT OUTER JOIN livro_lancamento AS LA ON LA.livro_id = L.livro_id WHERE L.livro_id = 14

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está certo colega, se eu colocar assim:

 

SELECT l. * , p. * , la.livro_lancamento_id, d.destaque_idFROM livro AS lINNER JOIN produto AS p ON (p.livro_id = l.livro_id)LEFT JOIN destaque AS d ON ((d.destaque_id = l.livro_id)AND (d.tipo = 'livro'))LEFT JOIN livro_lancamento AS la ON la.livro_id = l.livro_idWHERE l.livro_id =14LIMIT 0 , 50

Então funciona. Mas a ',' tem (ou costumava ter) o mesmo efeito que 'INNER JOIN'. "FROM livro AS l

INNER JOIN produto AS p ON (p.livro_id = l.livro_id)" tem o mesmo efeito que "FROM livro AS l, produto AS p (...) AND p.livro_id = l.livro_id".

 

Aliás, isso continua funcionando. Mas reparei, não só nesse, mas também em uma porção de outras querys, que muitas vezes dá problema quando se usa essa sintaxe da ',' e um 'LEFT JOIN' na mesma query. Se for isso mesmo, é um bug, pois em tese a sintaxe está correta. Quanto as vantagens do MySQL 5, até agora não vi nenhuma, mas também não pesquisei sobre o assunto. E o fato é que o grosso dos serviços de hospedagem por aí ainda usam MySQL 4 (alguns, como o Terra, ainda estão no 3).

Compartilhar este post


Link para o post
Compartilhar em outros sites

eh... complicado... qdo muda de versão eh uma desgraça..ahuhaua

 

mas assim... normalmente, pelo menos em oracle, se usa uma "regrinha"... qdo se usa relacionamento usando inner, left etc.. toda a query tem esta lógica.. qdo se usa relacionamentos com virgulas, toda a query tem virgulas, se o uso de inner e left... e no oracle se faz estas querys assim...

SELECT *FROM tabela1, tabela2 WHERE tabela1.codigo = tabela2.codigo -- INNER JOINSELECT *FROM tabela1, tabela2 WHERE tabela1.codigo(+) = tabela2.codigo -- LEFT OUTER JOIN
não sei se funfa no MySQL.. mas você pode tentar...

 

e qto as funcionalidades... acho q são indiscutíveis (apesar do bug informado)... Views, procedures, subquerys, function, melhora na parte transacional, etc, etc...

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.