Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Inner Join MyISAM


tércio fernandes

Pergunta

13 respostass a esta questão

Posts Recomendados

  • 0

Fala Dênis, e toda galera do ScriptBrasil bom dia.

Olha so essa situação:

Tenho duas tabelas lanc e lanc2, uma tem os lançamentos e a outra detalhamento do lançamento respectivamente. Mesmo assim, algumas colunas estão nas duas tabelas, como 'codigo_empresa', 'ano_lançamento', 'mes_lançamento', 'numero_lançamento'. Vejo que nem precisava essa duplicidade mas.....

Então estou precisando da um Inner join pra pegar so a empresa que quero o mes e o ano.

Estou dando um inner join:

select * 
from lanc as t1 
INNER join lanc2 as t2 ON (t1.numero_lançamento=t2.numero_lançamento) 
where t1.codigo_empresa = 45 and t1.mes_lancamento = 10 and t1.ano_lancamento = 2013;
Nesse mês 10 tenho apenas 2 lançamentos, porém quando disparo esse inner join vem uma porrada de resultados trazendo empresas que não deveria mês que não está no filtro etc.

Não o que estou fazendo de errado, ate criei uma tabela produtos e uma vendas pra fazer uns testes e pega direitinho, so traz o que ponho depois do WHERE, mas nessa de cima não vai...

Alguma sujestao?

Editado por Denis Courcy
colocar codigo no code
Link para o comentário
Compartilhar em outros sites

  • 0

Lembrando que tabelas do MySQL no formato MyIsam não suportam integridade referencial.

Se precisa deste tipo de integridade no seu banco, recomento o uso de InnoDB.

Um abraço

A escolha do engine tem muito a haver com a performance e o tipo de uso que você quer.

Tenho sistemas que funcionam muito bem com myisam. A integridade do banco é controlada via sistema.

Link para o comentário
Compartilhar em outros sites

  • 0

Também tentei:

select * from lanc2 t2, lanc t1

where t2.numero_lacamento=t1.numero_lacamento and t2.codigo_empresa = 0045 and t2.mes_lancamento = 10 and t2.ano_lancamento = 2013;

Porém também acontece a mesma coisa.

:(

Código do primeiro post

select * 
from lanc as t1 
INNER join lanc2 as t2 ON (t1.numero_lançamento=t2.numero_lançamento) 
where t1.codigo_empresa = 45 and t1.mes_lancamento = 10 and t1.ano_lancamento = 2013;

Se lanc2 tem mesmos campos de lanc você pode restringir a clausula ON do INNER JOIN.

SELECT * FROM lanc t1
INNER JOIN lanc2 t2 ON t2.numero_lacamento=t1.numero_lacamento AND t1.codigo_empresa=t2.codigo_empresa AND
   t1.ano_lancamento=t2.ano_lancamento AND t1.mes_lancamento=t2.mes_lancamento
WHERE t1.codigo_empresa = 45 and t1.mes_lancamento = 10 and t1.ano_lancamento = 2013;
Cuidado. Pelo que percebi sua chave é a primeira condição. t2.numero_lacamento=t1.numero_lacamento

Não pode ser abolida nem trocar de lugar neste arranjo ou você estará fadado a um TABLE SCAN.

Link para o comentário
Compartilhar em outros sites

  • 0

Table scan é uma busca sequencial. Quando em um join para cada registro da tabela pai vai procurar em todos os registros da tabela filho, não importando se o que você quer esteja só no primeiro registro.

Isto acontece quando você não usa índice ou usa índice errado.

No Caso acima o índice esta no primeiro elemento da condição (3 condições). Caso você não o forneça ou caso esta condição passe a ser em outra posição ele deixará de buscar pelo índice e passará a buscar por table scan.

Table scan normalmente SENTA o banco.

Só pra fechar, as outras condições poderiam estar na cláusula where mas, são mais eficientes se estiverem na cláusula ON do JOIN.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...