Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

MathBR

SELECT com 3 tabelas não estou sabendo retornar o que preciso

Recommended Posts

Olá galera quero a ajuda de vcs num SELECT que eu estou fazendo no qual envolve 3 tabelas:

 

tb_itens_fund (Tabela de Intes Fundidos onde eu irei pegar a descrição do item e linkar o código)

tb_itens_fund.desc_fund

tb_itens_fund.cod_fund

 

tb_est_fund (Tabela do estoque de itens fundidos onde se houver no estoque aparece a quantidade correspodente na frente da descrição do item, linkado pelo código)

tb_est_fund.cod_item

tb_est_fund.kg

tb_est_fund.pcs

 

tb_transf (Tabela onde são gravadas as transferências de peças entre os setores, linkado pelo codigo porém so exibir o que ainda esta pendente(status=1) e o que for para o estoque de intes fundidos (destino='fundicao'))

tb_transf.cod_transf

tb_transf.qtde_kg

tb_transf.qtde_pcs

tb_transf.destino

tb_transf.status

 

Isto é o que eu quero exibir:

 

Descrição______________Kg em estoque___Kg em transferencia

(Todos os itens da tabela)_(se houver)_____(se houver)

 

o problema é que todas as consultas que eu tenho testado só me retornam alguns itens por exemplo só os itens que contenham o mesmo código nas 3 tabelas, sendo que da tb_itens_fund eu quero exibir todos os itens e se não tiver o mesmo código no estoque e transferencia me retorne NULL mas que exiba sua descrição.

 

como eu tenho testado:

 

SELECT`tb_itens_fund`.`desc_fund`,`tb_transf`.`quant_kg`,`tb_transf`.`quant_uni`,`tb_est_fund`.`kg`,`tb_est_fund`.`unid`,`tb_itens_fund`.`cod_fund`FROM`tb_itens_fund`Left Join `tb_est_fund` ON `tb_est_fund`.`cod_item` = `tb_itens_fund`.`cod_fund`Inner Join `tb_transf` ON `tb_itens_fund`.`cod_fund` = `tb_transf`.`cod_transf`WHERE`tb_transf`.`status` =  '1' AND`tb_transf`.`destino` =  'fundicao';

Esta consulta so me retorna os itens que eu tenho em transferencia, ja tentei mudar a posição de seleção das tabelas não sei se isso influencia em algo mas o resultado nunca foi o que eu quis.

 

Como estou fazendo hoje:

Para quebrar o galho enquanto não aprendo os JOINS / WHERE / HAVING e etc.. do MySql eu tenho feito assim:

Selecione tudo da tabela de itens e se tiver no estoque coloque seu valor ao lado da descrição:

SELECT`tb_itens_fund`.`cod_fund`,`tb_itens_fund`.`desc_fund`,`tb_est_fund`.`kg`,`tb_est_fund`.`unid`FROM`tb_itens_fund`Left Join `tb_est_fund` ON `tb_itens_fund`.`cod_fund` = `tb_est_fund`.`cod_item`;

Então para verificar se existe na transferência dentro de um looping while eu verifico item por item

 

while($campo=mysql_fetch_array($consulta_acima)){SELECT`tb_transf`.`cod_transf`,`tb_transf`.`quant_kg`,`tb_transf`.`quant_uni`FROM`tb_transf`WHERE`tb_transf`.`destino` =  'fundicao' AND`tb_transf`.`status` =  '1'}

agora imagina como ta pesado tem +ou- 550 itens cadastrados e no loop elecheca 1 por 1 por isso eu queria aprender uma forma de fazer somente 1 consulta so, e se alguem tiver alguns links de tutoriais de como funciona os JOINS e sobre multi consultas, etc..

 

vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente assim:

 

SELECT  tb_itens_fund.cod_fund,  tb_itens_fund.desc_fund,  tb_est_fund.kg,  tb_est_fund.unid,  tb_transf.quant_kg,  tb_transf.quant_uniFROM  tb_itens_fund  LEFT JOIN tb_est_fund	ON tb_itens_fund.cod_fund = tb_est_fund.cod_item  LEFT JOIN tb_transf	ON tb_transf.cod_transf = tb_itens_fund.cod_fund	  AND tb_transf.status  = 1	  AND tb_transf.destino = 'fundicao'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não rolo cara ele me retornou + de 1 registro da tabela itens_fund onde ela so teria que listar a tabela pra mim e enquanto a alguma informação sobre os JOINS alguem conhece algum site? to querendo entender esses comandos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tipo isto é o que quero exibir:

 

Listar Todos os itens existentes na tabela tb_itens_fund (que são a lista das peças com a descrição), linkar ela a o estoque dessas peças tb_est_fund (porem nem toda peça listada terá no estoque então quero que nesta linha onde ele lista o item + ñ acha no estoque me retorne NULL nos campos da tb_est_fund), e link tb a listagem dos itens com uma tabela de transferencia onde é uma especie de entrada do estoque (tambem não havendo nenhuma transferencia para aquele item naquela linha retorna NULL nos campos da tb_transf) e tudo linkado pelo código do item.

Ficaria tipo assim:

 

 

 

 

Item____________- Kg em estoque__-__Unid em estoque___-__Kg em Transferencia - Unid em transferencia

Peça 0001________-_____10_______-_______50__________-__________5_________-_________10

Peça 0002________-_____NULL_____-_______NULL________-__________9_________-_________39 (so existe em transferencia)

Peça 0003________ -_____95_______-______269__________-________NULL________-_________NULL (so existe em estoque)

Peça 0004________-_____NULL______-_______NULL________-________NULL________-_________NULL (nem em transf nem em estoque)

 

o meu problema é que minha consulta SÓ me retorna o que existe TANTO no estoque/transferencia e Listagem dos itens, não me retorna os campos que eu quero em NULL e não exibi a listagem dos itens que não tem no estoque nem em transferencia.

 

ERRO: Eu percebi que estava pensando errado de uma forma:

Na tabela transferencia pode haver + de uma transferencia com o mesmo codigo desta forma ele linkava na descrição do item e saia duplicado esta descrição ai eu precebi que somando o resultado da busca na tabela de transferencia ele me retorna exatamente o que eu quero

Agora meu problema é que se eu adicionar a cláusula WHERE ou HAVING a consulta não exibi o que eu quero =/

 

a consulta que dá certo é esta:

 

SELECT  tb_itens_fund.cod_fund,  tb_itens_fund.desc_fund,  tb_est_fund.kg,  tb_est_fund.unid,  SUM(tb_transf.quant_kg),  SUM(tb_transf.quant_uni)FROM  tb_itens_fund  LEFT JOIN tb_est_fund	ON tb_itens_fund.cod_fund = tb_est_fund.cod_item  LEFT JOIN tb_transf	ON tb_transf.cod_transf = tb_itens_fund.cod_fundGROUP BY tb_itens_fund.cod_fund;
e eu preciso adicionar + as cláusulas:

 

WHERE tb_transf.destino = 'fundicao' AND tb_transf.status='1'

 

mas se eu adiciono isto a minha consulta ela para de exibir novamente os campos NULL e só exibi o que acha no estoque transf e listagem de itens

 

Vlw pela ajuda e pelo material ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

^^ muiiiiiiiiiito obrigado pela ajuda e pelo material fornecido deu pra ter uma boa noção e postando aki novamente meu problema eu achei a solução, bastava eu substituir o WHERE por AND aqui vai a consulta que me retorna exatamente o que eu preciso:

 

SELECT tb_itens_fund.cod_fund, tb_itens_fund.desc_fund, tb_est_fund.kg, tb_est_fund.unid, SUM( tb_transf.quant_kg ) , SUM( tb_transf.quant_uni ) FROM tb_itens_fundLEFT JOIN tb_est_fund ON tb_itens_fund.cod_fund = tb_est_fund.cod_itemLEFT JOIN tb_transf ON tb_transf.cod_transf = tb_itens_fund.cod_fundAND tb_transf.destino = 'fundicao'AND tb_transf.status = '1'GROUP BY tb_itens_fund.cod_fund;

Muito obrigado pela ajuda ;)

Cya

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.