Filtragem com JOIN

MySQL

Banco de Dados

11/06/2017

Boa noite.
Estou desenvolvendo uma rotina que consta do uso de duas tabela:
Uma tabela é uma lista de ítens de estoque de uma lanchonete onde constam produtos finais (para venda), produtos compostos (para venda) e produtos apenas para compor produtos compostos (compositores).
Os produtos usados para compor os itens compostos também estão cadastrados nesta tabela mas não estão disponíveis para venda.

Uma outra tabela é da composição do produto composto, com o id do produto final (para venda) e o id de cada item de estoque que compõe o mesmo.

Eu tenho duas telas onde a pessoa, irá criar a composição de cada item composto para venda.
Uma das telas é a dos itens que compõe o item para venda e a outra mostra todos os itens de composição que não estão incluidos nesta.

As chaves de referência que estou usando são:
- Tabela de produtos compostos para venda-> id_estoque
- Tabela de itens da composicao-> id_composto

Montei o seguinte SQL:

$filtercompostos="SELECT composicoes.*, estoque.* FROM composicoes INNER JOIN estoque ON composicoes.id_composto!=estoque.id_estoque Where estoque.id_empresa=".$_SESSION[logempresa]." && tipo_estoque='O' && composicoes.id_estoque=".$id_estoque." ORDER BY estoque.nome_estoque ASC";

$rescomp = mysql_query($sqlcomp,$conexao);


Quando possuo pelo menos um item de composição atribuido ao produto final funciona perfeitamente.
Mas quando não há nenhum item na composição do produto final, na tela onde deveriam aparecer todos os itens de composição que não constam no item final nada aparece.

Como não sou experiente gostaría da ajuda de alguém pois já tentei de tudo que estava ao meu alcance.
Se alguém puder me dar uma luz eu agradeço.
Luiz Fernando

Luiz Fernando

Curtidas 0

Respostas

Victor Machado

Victor Machado

11/06/2017

Opa Luiz Fernando,
Você pode utilizar o LEFT JOIN, que pega toda a primeira tabela inteira e o que achar da segunda, caso nada seja encontrado, o valor volta nulo.
GOSTEI 0
João Coelho

João Coelho

11/06/2017

Inner join faz uma junção entre duas tabelas A e B onde a projeção serão todos os elementos de A que estão em B.

Ex.: Quero todos os clientes de um banco e suas determinadas agencias:

select * from Clientes inner join Agencias on Cliente.idAgencia = Agencias.idAgencia
Um outer join pode ser Left, Rigth e Center (ou Cross).

Um left join faz uma junção entre A e B onde a projeção serão todos os elementos de A, independente se estão ou não em B.

Ex.: Quero todos os clientes do banco e a quantidade de movimentaçãoes efetuadas em abril de 2013:

select nomeCliente, count(idMovimentacao) from Clientes left outer join Movimentacoes on Clientes.idCliente = Movimentacoes.idCliente where Movimentacao.dtCompetencia = ''''04/2013''''

Na query acima nós utilizamos o left join para que todos os clientes sejam impressos, mesmo que não tenham feito nenhuma movimentação.

O Rigth join é equivalente ao left join, mas com a ordem trocada.
GOSTEI 0
Ivan Santos

Ivan Santos

11/06/2017

Olá Luiz,
Estou estudando também, e espero poder contribuir com sua solução, no entanto fiquei um pouco confuso com a forma que você apresentou seu sistema.

Por que você está utilizando este trecho? Para mim não fez sentido (composicoes.id_composto!=estoque.id_estoque).
Não seria o contrário, (composicoes.id_composto = estoque.id_estoque)?

Além disso, para o seu caso, acredito mesmo que LEFT JOIN é mais apropriado, pois se entendi bem, você quer retornar todos os resultados de composições, bem como os resultados de estoque que estiverem nesta composição. Caso não haja nenhum, a composição ainda irá retornar.

Porém não entendi se você quer filtrar os itens de estoque que ainda não estão na composição (os em que não há relação com a composição ainda), se for isso, então você não pode fazer um JOIN entre composição e estoque, pois neste caso, não haveria uma união entre as tabelas, portanto o JOIN não retornaria os demais itens de estoque.

Desculpe se entendi errado, vou acompanhar esta postagem caso você atualize com mais informações.
Abraço!

Ivan Santos
GOSTEI 0
POSTAR