boa tarde galera possuo a seguinte query sql
select f.nome,count(b.cod_fabricante),count(p.cod_fabricante)
from bebidas as b
inner join fabricantes as f
on f.codigo=b.cod_fabricante
inner join produtos as p
on f.codigo=p.cod_fabricante
group by f.nome;
a query deveria me retornar quantidade de produtos e bebidas e o nome de cada fabricante, porém ela está multiplicando as linhas e me retornando o resultado errado, com 1 inner join apenas, o código funciona perfeitamente, alguém poderia me ajudar com o que pode estar ocorrendo ?
Veja se alguma dessas formas ajuda:
Forma 1:
...
group by f.nome, b.cod_fabricante, p.cod_fabricante;
Forma 2:
...count(distinct b.cod_fabricante),count(distinct p.cod_fabricante)...
group by f.nome, b.cod_fabricante, p.cod_fabricante; me retorna o mesmo resultado…
já
count(distinct b.cod_fabricante),count(distinct p.cod_fabricante) me retorna todos resultados como 1.
Caso ajude, minhas tabelas são
cidade = (cod,nome)
fabricantes=(codigo,nome,cod_cidade)
bebidas=(codigo,descricao,cod_fabricante)
produtos=(codigo,descricao,cod_fabricante)
acredito que dê para ter uma noção melhor.
Agora que percebi, vc deve contar pelo codigo tanto do produto quanto da bebida, e não pelo cod_fabricante de cada um (o cod_fabricante serve apenas para juntar as tabelas)…
select f.nome,count(b.codigo),count(p.codigo)
from bebidas as b
inner join fabricantes as f on f.codigo=b.cod_fabricante
inner join produtos as p on f.codigo=p.cod_fabricante
group by f.nome;
Isso na teoria não deveria duplicar… agora se mesmo assim contar errado, vc precisa ver se todos os produtos e bebidas possuem a mesma quantidade de fabricantes, caso o contrário precisará usar left e não inner join:
select f.nome,count(b.codigo),count(p.codigo)
from fabricantes as f
left join bebidas as b on b.cod_fabricante = f.codigo
left join produtos as p on p.cod_fabricante = f.codigo
group by f.nome;
Perceba que mudei a ordem das tabelas ok? isso afeta os joins, pesquise mais a respeito…
Dessa forma ele consegue contar corretamente apenas onde encontrar bebidas vinculadas ou produtos vinculados pegou?
Por exemplo, se na tabela de bebidas vc tem 10 para um fabricante X e na produtos vc tem 5 para o mesmo fabricante, com INNER ele vai contar 10 para cada 1, usando LEFT ele irá contar 10 pra um e 5 pra outro… espero ter conseguido te passar a lógica…