Jump to content
Luiz Henrique

INNER JOIN duplicando resultados

Recommended Posts

Olá pessoas,

 

Preciso fazer uma consulta em 3 tabelas, mas quando insiro a 3ª na consulta já duplica resultados:

Tabela ticket

id,  id_cliente

 

Tabela clientes

id, nome

 

Tabela servicos_ticket

id, id_ticket, valor_ticket

 

Aqui OK

SELECT ticket.*, clientes.* FROM ticket JOIN clientes ON ticket.id_cliente = clientes.id 

Mas aqui duplica, porque um ticket pode ter vários serviços cadastrados.

ticket.*, clientes.*, servico_ticket.* FROM ticket 
JOIN clientes ON ticket.id_cliente = clientes.id 
JOIN servico_ticket ON ticket.id = servico_ticket.id_ticket

A listagem tem que ser apenas dos tickets cadastrados, tentei colocar DISTINCT ticket.* mas não adianta.

o resultado deveria ser algo assim:

 

12344 luiz 10.00

12345 henrique 20.00

 

mas se o ticket do luiz tiver 3 serviços cadastrados

 

12344 luiz 10.00

12344 luiz 10.00

12344 luiz 10.00

12345 henrique 20.00

 

e deveria ser apenas 1, aí eu faria a soma dos valores

 

12344 luiz 30.00

 

Como elimino essa duplicação?

Deu para entender?

Obrigado.

Share this post


Link to post
Share on other sites

Buenas tchê.

 

Tenta assim:

SELECT ticket.*, clientes.* 
FROM ticket t1 
JOIN clientes t2 ON ticket.id_cliente = clientes.id
where exists (select 1 from servico_ticket t3 where t3.id_ticket = t1.id_ticket) 

 

Edited by Marlon Pacheco
Escrevi código errado.

Share this post


Link to post
Share on other sites

Olá,

Não funcionou.

Consegui resolver com o GROUP BY

SELECT * FROM ticket t JOIN clientes c ON t.id_cliente = c.id_cliente JOIN servico_ticket st  ON t.id_ticket = st.id_ticket GROUP BY t.id_ticket

Porém, preciso tratar os dados e não sei como, ex:

A tabela servico_ticket contém os serviços cadastrados de cada ticket, podem ser vários, e lá consta o tipo do serviço, valor unitário e quantidade, e preciso pegar isso multiplicar e somar com os demais serviços para obter o valor finale ser apresentado na listagem de tickets, ex servico_ticket:

 

id: 1

ticket: 9999 

valor_servico: 10.00

quantidade_servico: 2

 

id:2

ticket: 9999

valor_servico: 30.00

quantidade_servico: 1

 

Neste caso preciso multiplicar o 10*2 do id1 e somar com os 30 do id2, para apresentar na listagem, mas usando o group by só consigo o primeiro registro.

 

Share this post


Link to post
Share on other sites

Seria isso?
 

CREATE TABLE IF NOT EXISTS `clientes` (
  `id_cliente` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(255) NOT NULL,
  PRIMARY KEY (`id_cliente`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `servico_ticket` (
  `id_servico_ticket` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `id_ticket` int(11) UNSIGNED NOT NULL,
  `servico` varchar(255) NOT NULL,
  `valor_servico` decimal(10,2) NOT NULL,
  `quantidade` tinyint(11) UNSIGNED NOT NULL DEFAULT '1',
  PRIMARY KEY (`id_servico_ticket`)
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `ticket` (
  `id_ticket` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `ticket` int(11) NOT NULL,
  `id_cliente` int(11) NOT NULL,
  PRIMARY KEY (`id_ticket`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;

Então consegui a soma do campo valor_servico, adicionando isso no select:

SELECT *, SUM(st.valor_servico) AS soma_servico

Ele faz a soma certo o problema é que é uma soma bruta, ignora a quantidade a ser multiplicada

Share this post


Link to post
Share on other sites
SUM(st.valor_servico*st_quantidade)

Eu devia ter testado isso antes de postar, achava que o sum só somaria, que não seria possível fazer cálculos secundários dentro da função!

 

Obrigado.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Omar~
      Então alguém teria uma ideia se existe uma forma mais correta (otimizada) para está executando uma query como essa:
      SELECT pages.p_hash, pages.p_title, pages.p_sector, pages.p_created, sectors.s_hash, sectors.s_title, sectors.s_link, users.u_hash, users.u_name FROM pages INNER JOIN sectors ON pages.p_sector = sectors.s_hash INNER JOIN users ON pages.p_created = users.u_hash  
      Não que venha ao caso mas por explicação mesmo.
      Entro na tabela páginas setores e usuários . Pois tenho que apresentar dados da página, o setor onde se encontra e quem foi o autor
    • By Rodymb
      Bom dia!
      Estou fazendo um select em uma tabela de cupom fiscal e preciso que me mostre o operador do caixa e o supervisor que liberou a venda, que no caso é convênio.
      A consulta que montei é a seguinte:
       
      select  c.m00ad as CUPOM,
              c.m00ac as PDV,
              c.m02ak as VALOR,
              p.descricao as FINALIZADORA,
              c.m02ah as OPERADOR,
              f.nome as NOME_OP,
              c.m02ao as SUPERVISOR,
              f.nome as NOME_SUP
      from zan_m02 c inner join tab_funcionario f
      on c.m02ao = f.cod_funcionario
      inner join tab_finalizadora p
      on c.m02ai = p.cod_finalizadora
      where c.m00af = to_date('09/03/20','dd/mm/yy')
      and c.m00za = 3
      and c.m00ac = 9
      and c.m00ad = 379678
      group by c.m00ad,c.m00ac,c.m02ak,p.descricao,c.m02ah,f.nome,c.m02ao;
       
      A consulta me retorna o seguinte resultado:

       
      Como podem ver, repetiu o mesmo nome (operador e supervisor), sendo que o código é diferente.
       
      Isso acontece por que na tabela de funcionário o campo NOME serve para operador e supervisor e o que diferencia se é supervisor ou operador temos mais duas outras tabelas. A estrutura é assim:
       
      tab_funcionario -> temos o campo cod_funcionario e nome (todos os funcionários cadastrados são armazenados nessa tabela)
      tab_perfil -> temos os campos cod_perfil e descricao (todos os perfis cadastrados são armazenados nessa tabela)
      tab_perfil_funcionario -> temos os campos cod_funcionario e cod_perfil (tabela que relaciona as tabelas tab_funcionario e tab_perfil)
       
      A única coisa que preciso é que apareça no NOME_OP o nome do operador e não o nome do supervisor igual está aparecendo.
       
    • By Luiz Henrique
      Olá pessoas,
       
      Preciso fazer uma consulta em 3 tabelas, mas quando insiro a 3ª na consulta já duplica resultados:
      Tabela ticket
      id,  id_cliente
       
      Tabela clientes
      id, nome
       
      Tabela servicos_ticket
      id, id_ticket, valor_ticket
       
      Aqui OK
      SELECT ticket.*, clientes.* FROM ticket JOIN clientes ON ticket.id_cliente = clientes.id Mas aqui duplica, porque um ticket pode ter vários serviços cadastrados.
      ticket.*, clientes.*, servico_ticket.* FROM ticket JOIN clientes ON ticket.id_cliente = clientes.id JOIN servico_ticket ON ticket.id = servico_ticket.id_ticket A listagem tem que ser apenas dos tickets cadastrados, tentei colocar DISTINCT tickets.* mas não adianta.
      o resultado deveria ser algo assim:
       
      12344 luiz 10.00
      12345 henrique 20.00
       
      mas se o ticket do luiz tiver 3 serviços cadastrados
       
      12344 luiz 10.00
      12344 luiz 10.00
      12344 luiz 10.00
      12345 henrique 20.00
       
      e deveria ser apenas 1, aí eu faria a soma dos valores
       
      12344 luiz 30.00
       
      Como elimino essa duplicação?
      Deu para entender?
      Obrigado.
    • By mldiogo87
      Olá,
       
      Estou desenvolvendo um sistema de cadastro de artigos para minha esposa, algo amador, simples, mas que precisa de certa funcionalidade.
       
      Me deparei com a seguinte situação, existirá a tabela no MySQL categoria e artigos.
       
      Dentro da tabela artigos existirá a coluna categoria, que se relacionará com a tabela categorias por simples inner join .
       
      O problema é que surgiu a necessidade de um mesmo artigo pertencer a mais de uma categoria, assim estou pesquisando soluções.
       
      Por exemplo, na hora de cadastrar várias categorias em uma linha da tabela artigos, a melhor forma é eu inserir os números dos ID’S das categorias separado por vírgula e na hora de chamar a consulta utilizar o explode do php ?
       
      Existe uma maneira mais simples para a solução dessa problemática ?
       
      Obrigado!
       
       
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.