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

Join, select, union com mais de 61 tabelas?


Deadoc

Pergunta

Boa tarde pessoal.

Sou desenvolvedor PHP + MySQL a 5 anos e hoje me deparei com um problema o qual não estou conseguindo resolver.

Preciso fazer um Join, Left Join, Right join q seja, ou mesmo, select da vida com 65 tabelas porém quem trabalha com mysql esta enjoado de saber que esse número é limitado a 61 tabelas ou 4096 colunas.

Quanto ao total de colunas está tranquilo pois possuo apenas 400! Agora o problema são as tabelas, ultrapassam o numero máximo permitido.

O que fazer?

Tentei criar 2 view contendo metade das tabelas cada, e logo após juntar em uma terceira, porém é retornado o mesmo erro que ultrapassou o limite.

Tentei fazer com select é retornado o mesmo erro.

Gostaria de saber se tem como criar uma unica tabela (em tempo de execução) contendo tudo, ou seja, as 65 tabelas em uma para resolver meu problema.

No caso tem que ser em tempo de execução, pois as tabelas são constantemente alimentadas por sistema WEB, e diariamente necessitara dessa junção para emissão de relatórios parciais.

Basicamente as tabelas estão da seguinte maneira

ID_tabela

Marca

Tipo

Descrição

Estado físico

se diferem em algumas particularidades e quanto ao numero de coluna, onde algumas tabelas possuem apenas 3 colunas e outras podem chegar a 7 colunas.

Alguém sabe como resolver esse impasse?

Obrigado por hora.

Editado por Deadoc
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0
...

Tentei criar 2 view contendo metade das tabelas cada, e logo após juntar em uma terceira, porém é retornado o mesmo erro que ultrapassou o limite.

...

Gostaria de saber se tem como criar uma unica tabela (em tempo de execução) contendo tudo, ou seja, as 65 tabelas em uma para resolver meu problema.

No caso tem que ser em tempo de execução, pois as tabelas são constantemente alimentadas por sistema WEB, e diariamente necessitara dessa junção para emissão de relatórios parciais.

...

Alguém sabe como resolver esse impasse?

Oi, 'Deadoc'!

Fazendo exatamente como você falou. Apenas que em vez de criar View crie tabelas myisam (dependendo do tamanho) e, depois, una-as..

Faça tudo através de uma storage procedure e parametrize conforme sua necessidade.

Link para o comentário
Compartilhar em outros sites

  • 0
...

Tentei criar 2 view contendo metade das tabelas cada, e logo após juntar em uma terceira, porém é retornado o mesmo erro que ultrapassou o limite.

...

Gostaria de saber se tem como criar uma unica tabela (em tempo de execução) contendo tudo, ou seja, as 65 tabelas em uma para resolver meu problema.

No caso tem que ser em tempo de execução, pois as tabelas são constantemente alimentadas por sistema WEB, e diariamente necessitara dessa junção para emissão de relatórios parciais.

...

Alguém sabe como resolver esse impasse?

Oi, 'Deadoc'!

Fazendo exatamente como você falou. Apenas que em vez de criar View crie tabelas myisam (dependendo do tamanho) e, depois, una-as..

Faça tudo através de uma storage procedure e parametrize conforme sua necessidade.

Certo mais como eu faço esse Storage Procedure nunca necessitei fazer isso!

Obrigado

Link para o comentário
Compartilhar em outros sites

  • 0
Certo mais como eu faço esse Storage Procedure nunca necessitei fazer isso!

Obrigado

Oi, 'Deadoc'!

Este é o esqueleto de uma SP para seu uso

DELIMITER $$;

DROP PROCEDURE IF EXISTS `test`.`teste`$$

CREATE PROCEDURE `test`.`teste` (aqui entram seus parametros)
BEGIN

   DROP TABLE IF EXISTS `tabela1`;
   CREATE TABLE `tabela1`
   ENGINE = MyISAM
   SELECT `aqui entra sua select`;
   ALTER TABLE `tabela1`
   ADD PRIMARY KEY (`coloque aqui o campo que será a PK desta tabela`); 
   
   DROP TABLE IF EXISTS `tabela2`;
   CREATE TABLE `tabela2`
   ENGINE = MyISAM
   SELECT `aqui entra sua select`;
   ALTER TABLE `tabela2`
   ADD PRIMARY KEY (`coloque aqui o campo que será a PK desta tabela`);   


   `aqui entram (ou não) outras instruções de seu interesse`

END$$
Para executar uma sp use:
CALL `nome da SP`(seus parametros);

Para saber mais sobre storage procedure leia o manual do MySQL de sua versão que deve ser 5.x

Link para o comentário
Compartilhar em outros sites

  • 0

Como não sei fazer o SP...

Resolvi de outra maneira...

Criei duas views... cada uma com metade dos campos...

Ficou mais ou menos assim...

View metade1 com os campos de 33 tabelas...

View metade2 com os campos restantes das outras 32 tabelas

Até ae normal...

Para Mostrar os dados eu fiz dois laços...

$i=0; $q=0;

    //Laço com a primeira metade dos dados (tabela metade1)
    $j = 0; while($exibe = $var_conn-> associa_registros($resultadoX)):    

        
       if (!($exibe['nome']==NULL)) {
            echo "<tr><td align='center'>".$i=($i+1)."</td><td>Nome:</td><td align='center'>".$exibe['nome']."</td><td>".$local."</td><td>".$exibe['status']."</td></tr>";
            $q=$q+1;//contador de linhas para paginação
            }
Assim que o contador q for igual a 25 quebra página automático para impressão dentro do A4
//testa pra fazer a formatação em 25 linhas
if ($q % 25 == 0){ //dessa forma se for multiplo de 25 ele já chama a função de paginação
    quebra_pagina(); //função que zera o contador, fecha tabela, inicia cabeçalho e tabela da próxima pagina
} else {
    //nada a fazer
}
logo após o segundo laço
//Segundo laço com dados da outra metade (tabela metade2)
   $k = 0; while($exibe2 = $var_conn-> associa_registros($resultadoY)):

if (!($exibe2["sobrenome"]==NULL)) {
    echo "<tr><td align='center'>".$i=($i+1)."</td><td>Sobrenome:</td><td align='center'>".$exibe2['sobrenome']."</td><td>".$local."</td><td>".$exibe2['status']."</td></tr>";
    $q=$q+1;
                }
$k++;  endwhile; //FIM DO SEGUNDO WHILE
assim quando acabar o segundo laço chama novamente a função de paginação
if ($q % 25 == 0){ //verifica se o numero de linhas é igual a 25
                    quebra_pagina(); //função que quebra página após 25 linhas
                } else { //condição de que não existe mais campos então encerra tabela de impressão
                    echo "</table>";
                    echo "<table border='0' align='center'><tr><td>&nbsp;</td><td><div align='center'><h3>";
                    include("data.php"); // função que insere data atual do servidor
                        echo "</h3></div></td></tr><tr><td>&nbsp;</td><td><div align='center'><h1>___________________________________</h1></div></td></tr></table>";
                    }
                    
        $j++;  endwhile; //finaliza o primeiro while após tudo...

Editado por Deadoc
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...