Ir para conteúdo

POWERED BY:

Arquivado

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

phpando

[Resolvido] Ordenar por Sub-Select ou fazer Inner Join com Sub-Se

Recommended Posts

Estou com um problema evidenciado em outro tópico que tinha um texto que não atendia ao propósito dele:

 

Tenho a seguinte Query:

/* Esta é a query SELECT */
$Query_Select = "SELECT 
pdt.id_departamento, pdt.id_departamento_sub, pdt.nome,
dpt.nome AS nome_departamento, 
sdpt.nome AS nome_subdepartamento 
FROM Produtos pdt , Departamentos dpt , Departamentos_Sub sdpt 
WHERE pdt.id IN ( 1 , 2, 3, 4, 5 ) AND dpt.id = pdt.id_departamento AND sdpt.id = pdt.id_departamento_sub 
LIMIT 0,5";

 

Nela busco todos os produtos selecionados, sem erro.

Agora preciso que nesta mesma query seja possível consultar 2 tabelas (Estoque e Vendas), subtraindo ambas para ter o número em estoque de cada produto.

Consegui pegar ambos os dados da seguinte forma:

 

/* Esta é a query SELECT */
$Query_Select = "SELECT 
pdt.id_departamento, pdt.id_departamento_sub, pdt.nome,
dpt.nome AS nome_departamento, 
sdpt.nome AS nome_subdepartamento,  
(SELECT COALESCE(SUM(quantidade),0) FROM Produtos_Estoque estq WHERE estq.id_produto = pdt.id GROUP BY estq.id_produto) AS total_estoque, 
(SELECT COALESCE(SUM(qtd),0) FROM Vendas_Produtos vendas WHERE vendas.id_produto = pdt.id GROUP BY vendas.id_produto) AS total_vendas
FROM Produtos pdt , Departamentos dpt , Departamentos_Sub sdpt 
WHERE pdt.id IN ( 1 , 2, 3, 4, 5 ) AND dpt.id = pdt.id_departamento AND sdpt.id = pdt.id_departamento_sub 
LIMIT 0,5";

 

Desta forma ao listar os registros eu tenho o ESTOQUE e as VENDAS, mas o objetivo não é este.

 

Preciso listar os produtos de forma que os que não estiverem em estoque fiquem no final da listagem.

 

Tentei utilizar o total_estoque e o total_vendas no ORDER BY, tentei dar JOIN, INNER JOIN com estes sub-selects que calculam os totais mas não consegui de jeito nenhum.

 

Agradeço qualquer ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, atualizando.

Consegui desenvolver uma forma que retorna o numero em estoque através do JOIN, mas está retornarndo a soma de todos os registros em estoque e não de cada produto individualmente.

 

Aqui a query atualizada:

$Query_Select = "
SELECT 
  pdt.id AS ID_PRODUTO, pdt.id_departamento, pdt.id_departamento_sub, pdt.nome, pdt.preco_normal, pdt.preco_prom, pdt.imagem_0, pdt.imagem_1, pdt.imagem_2, pdt.imagem_3, pdt.imagem_4, 
  dpt.nome AS nome_departamento, sdpt.nome AS nome_subdepartamento, 
  estoque.qtd_estoque 
FROM 
  Produtos AS pdt RIGHT JOIN (SELECT id_produto, COALESCE(SUM(quantidade),0) AS qtd_estoque FROM Produtos_Estoque) AS estoque ON estoque.id_produto = pdt.id , 
  Departamentos AS dpt , 
  Departamentos_Sub AS sdpt 
WHERE 
  pdt.id IN ( 22 , 5 , 2 , 24 , 23 , 26 , 25 ) AND dpt.id = pdt.id_departamento AND sdpt.id = pdt.id_departamento_sub LIMIT 0,7");

Eu tentei colocar um "WHERE id_produto = pdt.id" dentro do JOIN mas retornou que não encontra a coluna.

Alguém sabe como fazer?

 

Meio caminho já foi andado, preciso agora saber como dar um JOIN do Total de Vendas e se possível calcular eles dentro da query e gravar em uma coluna para poder ordena-los de forma decrescente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

As tabelas são as seguintes:

 

Produtos_Estoque

- id (PRIMARY KEY)
- id_produto
- quantidade

Produtos_Vendas

- id (PRIMARY KEY)
- id_produto
- quantidade

Compartilhar este post


Link para o post
Compartilhar em outros sites

RESOLVIDO!

 

Já estava ficando louco, mas consegui simplificar tudo sem fazer JOINS, bastou aninhar 2 sub-selects e atribuir a um campo o total em estoque de cada produto.

 

Query Funcional

/* Query SQL */
$SQL_QUERY = "
SELECT 
  pdt.id, pdt.id_departamento, pdt.id_departamento_sub,  pdt.nome, pdt.preco_normal, pdt.preco_prom, pdt.imagem_0,  pdt.imagem_1,  pdt.imagem_2,  pdt.imagem_3,  pdt.imagem_4, 
  dpt.nome AS nome_departamento, sdpt.nome AS  nome_subdepartamento, 
  (COALESCE((SELECT COALESCE(SUM(quantidade),0) FROM Produtos_Estoque estq WHERE estq.id_produto = pdt.id GROUP BY estq.id_produto) - 
  (SELECT COALESCE(SUM(qtd),0) FROM Vendas_Produtos vendas WHERE vendas.id_produto = pdt.id GROUP BY vendas.id_produto), 0)) AS qtd_estoque	 
FROM	
  Produtos pdt , 
  Departamentos dpt , 
  Departamentos_Sub sdpt 
WHERE 
 pdt.id IN ( 1,2,3,4,5 ) AND dpt.id = pdt.id_departamento AND sdpt.id = pdt.id_departamento_sub"; 	

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.