Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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.Consegue enviar aqui o DDL das tabelas??
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 multiplicadaSUM(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.
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)