Ir para conteúdo

Arquivado

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

Maykel-ctba

Busca em várias categorias

Recommended Posts

@Motta, o problema de usar o IN diretamente assim quer dizer que vai pegar todos os produtos que tenham TODAS ou ao menos uma destas, não? Vai acabar trazendo produtos que não correspondem a pesquisa feita.

 

Mas já vi que está bem problemático... ou eu não estou sabendo explicar, haha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio ser problema de modelo , pois seu modelo torna a busca mais confusa.

 

A busca que mostrei trará que produtos que tenham ao menos uma das categorias

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio ser problema de modelo , pois seu modelo torna a busca mais confusa.

 

A busca que mostrei trará que produtos que tenham ao menos uma das categorias

 

Grande Motta, só por curiosidade, existe alguma forma mais elegante de escrever esse código:

SELECT DISTINCT grupo1.g1pro AS id, grupo1.g1titulo AS produto FROM (

  (SELECT prsId AS g1prs, secId AS g1sec, proTitulo AS g1titulo, sistema_produto_secao.proId  AS g1pro FROM sistema_produto_secao
  LEFT JOIN sistema_produto ON sistema_produto.proId = sistema_produto_secao.proId)grupo1, 

  (SELECT prsId AS g2prs, secId AS g2sec, proTitulo AS g2titulo, sistema_produto_secao.proId  AS g2pro FROM sistema_produto_secao
  LEFT JOIN sistema_produto ON sistema_produto.proId = sistema_produto_secao.proId)grupo2

)

WHERE g1sec = 5 AND g2sec = 15
AND grupo1.g1pro = grupo2.g2pro

Achei que ficou muito robusto... :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Motta, pois é... mas não é bem o intuito da pesquisa... seu exemplo com INs traria o mesmo resultado que:

SELECT * FROM produto WHERE (secId = 1 OR secId = 2 OR secId = 15)

E não é o caso.

 

Quando eu busco um produto nas lojas, ele usa a mesma lógica que eu preciso:

 

Preciso de produtos da seção Mochilas OU Cases que façam parte também da categoria Para Feiras.

 

Não pode ser um ou outro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Leo Feijo rodei sua Query, e não entendi bulhufas :o . Você está pesquisando pelos IDs de seção 5 e 15?

 

Se sim, não estão trazendo os resultados esperados. Estão trazendo menos produtos do que deveriam.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok , digamos que ele tenha de ter as categorias 1,5 e 13

select *
from produtos
where cod_produto in (select cod_produto
                      from produto_categoria 
                      where categoria in (1,5,13)
                      having count(distinct categoria) = 3)

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Tá confuso... rs

 

Mas tenta isso daí... A lógica é a mesma:

[...]
WHERE g1sec = 5 AND g2sec = 15
AND grupo1.g1pro = grupo2.g2pro

 

Me aproveitando da Query do Leo, alterei só a parte do WHERE:

SELECT DISTINCT grupo1.g1pro AS id, grupo1.g1titulo AS produto FROM (

  (SELECT prsId AS g1prs, secId AS g1sec, proTitulo AS g1titulo, sistema_produto_secao.proId  AS g1pro FROM sistema_produto_secao
  LEFT JOIN sistema_produto ON sistema_produto.proId = sistema_produto_secao.proId)grupo1, 

  (SELECT prsId AS g2prs, secId AS g2sec, proTitulo AS g2titulo, sistema_produto_secao.proId  AS g2pro FROM sistema_produto_secao
  LEFT JOIN sistema_produto ON sistema_produto.proId = sistema_produto_secao.proId)grupo2

)

WHERE grupo1.g1pro = grupo2.g2pro
  AND g1sec IN(1,2) AND g2sec IN(15)

Pra mim funcionou com essa adaptação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Leo Feijo rodei sua Query, e não entendi bulhufas :o . Você está pesquisando pelos IDs de seção 5 e 15?

 

Se sim, não estão trazendo os resultados esperados.

 

É isso aí. Aqui para mim funcionou bem, retornou:

 

 

1 Mochila Prius

5 Mochila Danka Neo Traveller

4 Maleta Neo Ultraslim

 

Não seria esse o resultado esperado? O que retornou para você?

 

É um produto cartesiano, entre 2 tabelas iguais, no qual você confronta se a coluna com o id da categoria também possui o id em outra categoria para o mesmo produto.

 

A partir daí você pode confrontar os 2 conjuntos que desejar, como o exemplo do lokaodomau

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, aparentemente deu certo, @Leo Feijo! Eu que vacilei e não bati os IDs na conferência!

Vou testar com um pouco mais de calma!

 

Com a adaptação do @lokaodomau, ficou ainda melhor, já que contem os conjuntos que preciso!

 

Vamos ver, vamos ver! Pago uma cerveja pra quem estiver em Curitiba :lol:

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Motta, estou adaptando sua tentativa aqui com os campos que tenho hoje.

SELECT *
FROM sistema_produto
WHERE proId in (
    SELECT proId
    FROM sistema_produto_secao 
    WHERE secId IN (1,5,13)
	HAVING COUNT(DISTINCT secId) = 3
)

E só retornou um produto. Sendo que deveria resultar em 3. O que é esse secId = 3 do final?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Motta, estou adaptando sua tentativa aqui com os campos que tenho hoje.

select *
from sistema_produto
where proId in (select proId
                      from sistema_produto_secao 
                      where secId in (1,5,13)
                      having count(distinct secId) = 3)

E só retornou um produto. Sendo que deveria resultar em 3.

 

Também achei genial essa lógica. Mas parei na mesma dificuldade, só retorna 1.

 

Ele deveria contar a quantidade de ocorrências do conjunto...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria esse 3

having count(distinct secId) = 3)

A quantidade de seções buscadas?

Isso, a busca teria que corresponder a um resultado da seção 1, um resultado da seção 5 e um resultado da seçao 15.

 

Toda a consulta funciona bem, exceto essa parte:

having count(distinct secId) = 3)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Maykel, talvez o Motta consiga nos ajudar a deixar esse código bem legal, mas consegui adaptar para o seguinte:

SELECT * FROM sistema_produto
​
WHERE proId IN (
  SELECT proId
  FROM sistema_produto_secao
  WHERE secId IN (1,5)
)

AND proId IN (
  SELECT proId
  FROM sistema_produto_secao
  WHERE secId IN (13)
) 
Acho que ficou bom também. Satisfeito por aqui. :)
Se bem que essa forma talvez seja até mais eficiente para o seu caso, visto que se no grupo unico você tivesse 13,14,15, iria trazer um resultado inesperado no contador. Assim fica resultados de categoria 1 e/ou 5 e 13

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, matou!

 

Você e o @Motta mataram a pau! Muito, mas muito obrigado pela paciência e pelo ótimo aprendizado!

 

Eu tô aprendendo junto! :D Valeu Maykel.

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.