Ir para conteúdo

POWERED BY:

Arquivado

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

Eragon

Produtos em 2 categorias N X N

Recommended Posts

Bom dia, tenho a seguinte estrutura

 

PRODUTO

id

titulo

preco

 

PRODUTO_X_CATEGORIA

id

id_produto

id_categoria

 

CATEGORIA

id

titulo

descricao

ativo

 

O problema é que tenho o produto em 2 categorias, porém não quero trazer a descrição da categoria que está ativo='0'. Há produtos que não precisam estar em categorias por isso precisa ser LEFT/RIGHT JOIN

 

 

Imaginem o produto 1 está na categoria 1 e 2, só que a categoria 1 está inativa, mas no select o título resgatado ainda é da categoria 1 mesmo com ela desativada.

 

veja o select

 

 

SELECT A.*, C.titulo as titulo_categoria FROM produtos A
LEFT JOIN produto_x_categorias B ON A.id = B.id_produto
LEFT JOIN categorias C ON (C.ativo ='1' AND C.id = B.id_categoria)
WHERE A.id='1'
GROUP BY A.id LIMIT 1
Creio que o problema é no LEFT JOIN produto_x_categorias B ON A.id = B.id_produto pois ele pega mesmo sem a categorias estar ativa
Podem me ajudar? grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente fazer um outer join em CATEGORIA, teste o ATIVO com COALESCE

 

and COALESCE(CATEGORIA.ATIVO,1) = 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

PAULO: Na verdade eu não quero retornar duas linhas, quero retornar o produto com a categoria ativa. Está retornando com categoria inativa também, ou seja, antes do left join do ativo ele seleciona a categoria do produto. O filtro ativo é aplicado no left join seguinte.

 

MOTTA: Obrigado, vou testar



Testei com INNER JOIN, porém aí no caso os produtos sem categoria não retornam.

 

Resolvi temporariamente da seguinte forma, porém sei que não é o mais correto. Dessa forma ele só joga para o segundo LEFT as categorias ativas.

 

AND B.id_campanha IN (SELECT id FROM campanhas

 

SELECT A.*, C.titulo as titulo_categoria FROM produtos A
LEFT JOIN produto_x_categorias B ON
(A.id = B.id_produto AND B.id_categoria IN ( SELECT id FROM categorias WHERE ativo='1'))
LEFT JOIN categorias C ON (C.ativo ='1' AND C.id = B.id_categoria)
WHERE A.id='1'
GROUP BY A.id LIMIT 1

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.