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

(Resolvido) LEFT JOIN com 6 tabelas


Erilton

Pergunta

Fala galera!

Já estou com dor de cabeça num sisteminha que estou montando aqui para minha assistência técnica.

Resumindo:

Controlo meus clientes hoje em ACCESS e começou a aumentar o volume, então, estou passando tudo para MYSQL AND PHP.

Sou iniciante em programação WEB.

Onde estou:

Montei a página inicial que carrega todos os clientes cadastrados e outras informações básicas, até aí Ok.

Ao clicar em qualquer um destes clientes, passo as informações via URL/GET para uma outra página que possui os detalhes do cliente.

Cada cliente pode ter mais de um computador, mais de um contato, mais de um periferico, mais de um atendimento e esta página "detalhes" precisa repetir todas os itens quando > 1.

Todos estes campos que podem possuir mais de um resultado estão em tabelas. Ou seja, tenho além da tabela principal (clientes) + 5 outras tabelas.

O que está acontecendo:

Ao resgatar os dados do cliente, por exemplo, se ele tiver 10 computadores, os outros dados, perifericos, contatos, atendimentos, etc se repetirão 10 vezes também. Se eu agrupar um item específico ele retorna todos os resultados com a quantidade daquele item.

Estou postando o meu código para que vocês possam comentar onde estou errando.

Eu creio que esteja dentro do LEFT JOIN, GROUP BY ou até mesmo faltando criar um Record Set carregando item por item.

O que acham?

Como viram... estou perdido... :wacko:

<?php

$cliente = $_GET['cliente'];

$sql = "SELECT

c.*,

pc.*,

pc.descricao_computador AS descricao_pc,

ctt.*,

prf.*,

at.*,

f.*

FROM clientes c

LEFT JOIN computadores pc ON c.id_cliente = pc.id_cliente

LEFT JOIN contatos ctt ON c.id_cliente = ctt.id_cliente

LEFT JOIN perifericos prf ON c.id_cliente = prf.id_cliente

LEFT JOIN atendimentos at ON c.id_cliente = at.id_cliente

LEFT JOIN funcionarios f ON at.id_funcionario = f.id_funcionario

WHERE (c.id_cliente = '$cliente')

ORDER BY contato_nome, descricao_pc ASC";

$query = mysql_query($sql);

?>

// Iniciando o while.

<?php

while ($row = mysql_fetch_assoc($query)) {

?>

// Exibindo informações:
Campo: <?php echo $row['nome_campo] ?>

// Finalizando o while

<?php

}

?>

Forte abraço e agradeço desde já.

Ton

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Erilton,

Existem várias formas de fazer isso, com orientação a objeto, mas como você é iniciante, nesta pagina, você terá que fazer um SQL-SELECT para cada conjunto de dados relacionados ao cliente.

Segue abaixo um exemplo

<?php
    $cliente = trim($_GET['cliente']);
    
    $strCliente      = "SELECT * FROM clientes WHERE id_cliente = '$cliente'";
    $strComputadores = "SELECT * FROM computadores WHERE id_cliente = '$cliente'";
    $strContatos     = "SELECT * FROM contatos WHERE id_cliente = '$cliente'";
    $strPerifericos  = "SELECT * FROM perifericos WHERE id_cliente = '$cliente'";
    $strAtendimentos = "SELECT * 
                        FROM   atendimentos
                               LEFT JOIN funcionarios 
                                    ON atendimentos.id_funcionario = funcionarios.id_funcionario
                        WHERE  id_cliente = '$cliente'";



    /** 
     * Exibe dados do Cliente 
     * Como só tera uma linha da tabela que identifica o cliente, utilize, mysql_result
     */

    $queryCliente = mysql_query($strCliente);
    
    if (mysql_num_rows($queryCliente))
    {
        echo mysql_result($queryCliente,0,'nomeCliente');
        echo mysql_result($queryCliente,0,'cpf');
        [........]
    }




    /** 
     * Exibe dados dos computadores
     */

    $queryComputadores = mysql_query($strComputadores);
    
    if (mysql_num_rows($queryComputadores))
    {
        while ($row = mysql_fetch_assoc($queryComputadores)) 
        {
            [......]
        }
    }


       [........]
?>

Qualquer duvida posta ai,

Abraço

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

  • 0

Romero, matou a pau!

Valeu pela força!

Agora estou com um problema no INNER JOIN da tabela atendimentos.

O que você postou está funcionando certinho mas preciso pegar mais um item que está em outra tabela, computadores.

Tem alguma restrição ou limitação da forma que estou fazendo???

Veja como está agora:

<?php
    $cliente = trim($_GET['cliente']);
    
    $strCliente      = "SELECT * FROM clientes WHERE id_cliente = '$cliente'";
    $strComputadores = "SELECT * FROM computadores AS pc WHERE id_cliente = '$cliente'";
    $strContatos     = "SELECT * FROM contatos WHERE id_cliente = '$cliente'";
    $strPerifericos  = "SELECT * FROM perifericos WHERE id_cliente = '$cliente'";
    $strAtendimentos = "SELECT 
                        at.id_atendimento, at.data_atendimento, at.tipo_problema, at.status,
                        func.id_funcionario, func.funcionario_nome,
                        pc.id_pc, pc.descricao_computador
                        
                        FROM   atendimentos AS at
                                LEFT JOIN funcionarios    AS func    ON at.id_funcionario = func.id_funcionario
                                LEFT JOIN computadores    AS pc    ON at.id_pc = pc.id_pc

                        WHERE  id_cliente = '$cliente'";

?>
Continuo com o while:
<?php
    $queryAtendimentos = mysql_query($strAtendimentos);
    
    if (mysql_num_rows($queryAtendimentos))
    {
        while ($row = mysql_fetch_assoc($queryAtendimentos)) 
        {... }
?>

Forte abraço,

Ton

Link para o comentário
Compartilhar em outros sites

  • 0

Erilton, blza kara!

Quando ocorrer algum problema, é interessante você postar a mensagem de erro retornada pelo PHP,

Pelo que pude perceber, você está com um problema na clausula WHERE de sua query,

Nela, você quer retornar todos os registros que contenham id_cliente = '$cliente', mas, o problema é que a tabela atendimento e tabela computadores possuem o mesmo campo id_cliente. Portanto, você precisa especificar de qual tabela quer buscar o id_cliente, então, o where ficou assim: WHERE at.id_cliente = '$cliente'"; buscando o id_cliente da tabela de atendimento.

Faça um teste ai,

<?php
    $cliente = trim($_GET['cliente']);
    
    $strCliente      = "SELECT * FROM clientes WHERE id_cliente = '$cliente'";
    $strComputadores = "SELECT * FROM computadores AS pc WHERE id_cliente = '$cliente'";
    $strContatos     = "SELECT * FROM contatos WHERE id_cliente = '$cliente'";
    $strPerifericos  = "SELECT * FROM perifericos WHERE id_cliente = '$cliente'";
    $strAtendimentos = "SELECT
                        at.id_atendimento, at.data_atendimento, at.tipo_problema, at.status,
                        func.id_funcionario, func.funcionario_nome,
                        pc.id_pc, pc.descricao_computador
                        
                        FROM   atendimentos AS at
                                LEFT JOIN funcionarios    AS func    ON at.id_funcionario = func.id_funcionario
                                LEFT JOIN computadores    AS pc    ON at.id_pc = pc.id_pc

                        WHERE  at.id_cliente = '$cliente'";
?>

Abraço!

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

  • 0

Pô cara... foi mal.. me empolguei escrevendo e esqueci de jogar o erro, rsrs..

Novamente matou a pau, rsrs..

Eu estava tão bitolado no select e join e esqueci de especificar o where.

Agora para efeito de curiosidade vou procurar sobre a programação orientada a objeto.

Valeu pela força!!!

Forte abraço!

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
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...