Ir para conteúdo

POWERED BY:

Arquivado

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

gustavo Kirk

Ordenar busca por valor

Recommended Posts

Boa tarde, segue meu problema pessoal...

 

Possuo 3 tabelas no banco de dados

 

tabela: produtos

tabela: produtos_atributos

tabela: produtos_cores

 

Na hora de inserir um novo produto no banco de dados eu tenho as seguintes opções:

 

1- inserir um produto único

2- Inserir um produto com cores diferentes

3- Inserir um produto com atributos(tamanhos) diferentes

4- Inserir um produto com atributos(tamanhos) diferentes e cores diferentes

 

resumindo

 

digamos que eu tenha:

 

1 produto único inserido (1x1) = 1 produto

1 produto com 2 cores inseridos (1x2) = 2 produtos

1 produto com 2 atributos(tamanhos) inseridos (1x2) = 2 produtos

1 produto com 2 atributos(tamanhos) e em cada tamanho eu tenho 2 cores inseridas (1x2x2) = 4 produtos

 

no total eu tenho 4 produtos que geram ao todo 9 variações do produto.

 

até este ponto tudo bem, fiz a busca no banco de dados e ela me retornou perfeitamente, o problema acontece quando quero ordenar está busca pelo valor, e este problema vou explicar logo abaixo:

 

na tabela produtos eu tenho o campo valor e o campo valor_promocao

na tabela produtos_atributos eu tenho novamente o campo valor (pois cada atributo por ter um valor diferente)

na tabela produtos_cores eu tenho novamente o campo valor (pois cada cor por ter um valor diferente)

 

então quando eu faço a busca ela me retorna 4 campos de valor

 

valor da tabela produto

valor_promocao da tabela produto

valor da tabela produtos_atributos
valor da tabela produtos_cores

 

Como são campos diferentes eu não consigo ordenar corretamente quando tento ordenar do menor para o maior etc...

 

segue agora a query que estou usando para realizar a busca

 

se alguém puder apontar o caminho certo para que eu consiga executar corretamente eu agradeço desde já!

SELECT 

p.ID, p.NOME, p.VALOR, p.VALOR_PROMOCAO,

pc.ID AS IDPC, pc.NOME AS NOMEPC, pc.VALOR AS VALORPC,

pa.ID AS IDPA, pa.ATRIBUTO, pa.VALOR AS VALORPA,

pc2.ID AS IDPC2, pc2.NOME AS NOMEPC2, pc2.VALOR AS VALORPC2

FROM 

empresas e, loja_virtual lv, produtos p

LEFT JOIN produtos_cores pc ON pc.IDPRODUTO = p.ID

LEFT JOIN produtos_atributos pa ON pa.IDPRODUTO = p.ID

LEFT JOIN produtos_cores pc2 ON pc2.IDATRIBUTO = pa.ID

WHERE 

e.ID = 3 AND 

e.ID = lv.IDEMPRESA AND 

p.IDLOJA_VIRTUAL = lv.ID AND 

p.STATUS <> 2 AND

p.ID = pa.IDPRODUTO AND

pa.ID = pc2.IDATRIBUTO		

OR

e.ID = 3 AND 

e.ID = lv.IDEMPRESA AND 

p.IDLOJA_VIRTUAL = lv.ID AND 

p.STATUS <> 2 AND

p.ID = pc.IDPRODUTO AND 
           
NOT EXISTS (SELECT null FROM produtos_atributos pa WHERE pa.IDPRODUTO = p.ID)

OR

e.ID = 3 AND 

e.ID = lv.IDEMPRESA AND 

p.IDLOJA_VIRTUAL = lv.ID AND 

p.STATUS <> 2 AND

p.ID = pa.IDPRODUTO AND

NOT EXISTS (SELECT null FROM produtos_cores pc2 WHERE pc2.IDATRIBUTO = pa.ID)

OR

e.ID = 3 AND 

e.ID = lv.IDEMPRESA AND 

p.IDLOJA_VIRTUAL = lv.ID AND 

p.STATUS <> 2 AND 

NOT EXISTS (SELECT null FROM produtos_atributos pa WHERE pa.IDPRODUTO = p.ID) AND

NOT EXISTS (SELECT null FROM produtos_cores pc WHERE pc.IDPRODUTO = p.ID)            

ORDER BY pc2.VALOR, pc.VALOR, pa.VALOR, p.VALOR ASC

LIMIT 12

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual valor predomina? Quais condições para que isso aconteça?

 

Sei que não ajudei a solucionar a sua dúvida, mas acho que você só se perdeu um pouco no raciocínio.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O valor predominante depende se o produto tem atributos, atributos com cores, produtos com cores ou apenas produtos, segue as opções abaixo

 

Se existir um produto com cor e atributo o valor predominante é o valor da tabela produtos_cores
Se existir um produto com apenas o atributo o valor predominante é o da tabela produtos_atributos

Se existir um produto apenas com a cor o valor predominante é o da tabela produtos_cores

Se existir um produto sem atributos e sem cores o valor predominante é o da tabela produtos

 

 

Segue anexo imagem com o resultado da minha consulta

 

resultado.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode utilizar o CASE (dois links, o primeiro é um artigo do IMasters e o segundo é do manual do MySQL).

Exemplo:

SELECT
  CASE
    WHEN NOT pc2.id IS NULL THEN pc2.VALOR, # caso encontre valor da cor pelo atributo
    WHEN NOT pa.id IS NULL THEN pa.VALOR, # caso encontre o valor do atributo
    WHEN NOT pc.id IS NULL THEN pc.VALOR, # caso encontre o valor da cor
    WHEN p.VALOR_PROMOCAO > 0 THEN p.VALOR_PROMOCAO, # caso exista valor da promocao
    ELSE p.VALOR # valor padrao
  END valor_predominante
FROM produtos p
LEFT JOIN produtos_cores pc ON pc.IDPRODUTO = p.ID
LEFT JOIN produtos_atributos pa ON pa.IDPRODUTO = pID
LEFT JOIN produtos_cores pc2 ON pc2.IDATRIBUTO = pa.ID
WHERE ... # Dê continuidade
ORDER BY valor_predominante ASC

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.