Ir para conteúdo

Arquivado

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

luisym

Consulta para retornar produtos similares

Recommended Posts

Tenho a tabela em mysql produtos e caraterísticas

 

Produtos

tenho os produtos cadastrados

 

Caraterísticas (característica, produto)

relaciono as características com os produtos

 

Preciso listar os 5 produtos com maior quantidade de características iguais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenho as tabelas

 

Produtos

-idprod

-nome

...

 

produtos_caraterísticas (característica, produto) relaciono as características com os produtos

- produto (recebe idprod)

- caracteristica (recebe idcarac)

 

 

caraterística Caracteristicas de produto

- idcarac

- nome

...

 

Preciso listar os 5 produtos que tem maior quantidade de características similares ao produto atual

 

Exemplo estou no produto idprod 1

 

Quero pegar os 5 produtos que tenham a maior quantidade de características iguais que o produto 1

 

Para poder recomendar produtos similares baseados nessas características.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma ideia básica , creio que cabe melhora.

 

Produtos

-idprod

-nome

...

 

produtos_caraterísticas (característica, produto) relaciono as características com os produtos

- produto (recebe idprod)

- caracteristica (recebe idcarac)

 

 

caraterística Caracteristicas de produto

- idcarac

- nome

...

 

caraterística de 1 prod

 

select c1.idcarac
from produtos p1,produtos_caraterísticas pc1,caraterística c1
where p1.idprod = '1'
and pc1.idprod = p1.idprod
and c1.idcarac = pc1.idcarac

 

 

busca parecidos

 

select pc2.idprod , count(distinct pc2.idcarac) qtd
from   produtos_caraterísticas pc2  
where  pc2.idprod <> '1'
and    pc2.idcarac in (select c1.idcarac
		from produtos p1,produtos_caraterísticas pc1,caraterística c1
		where p1.idprod = '1'
		and pc1.idprod = p1.idprod
		and c1.idcarac = pc1.idcarac)
group by pc2.idprod
order by 2 desc

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza nesse raciocínio consegui bolar a recomendação por produtos similares, gostaria de colocar peso nas características pois uma característica é mais importante que outra.

 

Tenho como criar uma variável no sql para que eu possa multiplicar pelo peso da característica e no final ordenar por este peso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cria uma coluna PESO na tabela caracteristicas ao invés de dar um

count(distinct pc2.idcarac)

faça um

sum(peso)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tentando agora colocar para mostrar produtos os 4 produtos mais comprados junto com um determinado produto

 

 

To testando assim mas ele entra num loop e nao sai mais ja tentei de tudo mas não to visualizando o erro

 

SELECT id_prod, count(id_prod) as qtd from pedido_carrinho where compra in (select DISTINCT compra from pedido_carrinho where id_prod = 721 and id > ((select MAX(id) from pedido_carrinho ) - 1000) ) and id > ((select MAX(id) from pedido_carrinho ) - 2000) and id_prod <> 721 ORDER BY qtd desc limit 0, 4

 

Onde estou errando?

 

alias ta assim

 

 

SELECT id_prod, count(id_prod) as qtd from pedido_carrinho where compra in (select DISTINCT compra from pedido_carrinho where id_prod = 721 and id > ((select MAX(id) from pedido_carrinho ) - 1000) ) and id_prod <> 721 ORDER BY qtd desc limit 0, 4

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT id_prod, count(id_prod) as qtd 
from pedido_carrinho 
where compra in (select DISTINCT compra 
                from pedido_carrinho 
                where id_prod = 721 
                and id > ((select MAX(id) from pedido_carrinho ) - 1000) ) 
and id_prod <> 721 
ORDER BY qtd desc limit 0, 4 

 

Parece certo mas se pedido_carrinho.id_prod não for chave de íncide a query vai demorar mesmo.

 

Eu criaria uma tabela com este produtos "comprados junto" e a alimentaria via uma procedure que rodaria batch num horário de ociosidade do Sistema.

 

Tenho quae certeza que já vi um tópico semenhente a este aqui mas não o achei.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nunca usei procedure, vou dar uma olhada me parece a melhor solução mesmo pois quero colocar essa consulta no carrinho de ficar lento o resultado vai ser pior.

 

Se eu colocar i idprod como indice muda algo na minha estrutura atual pode deixar mais lento em outras consultas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Criar mais um índice onera a gravação (insert/update/delete).

Mas se vai rodar em batch talvez o tempo não seja tão importante assim.

--

Grosso modo :

Criar uma tabela para produtos "também comprou"

Organizar bem a hierarquia cliente>>comprou , não se iluda não é tão simples.

Uma SP para carregar as tabelas, pode usar o EVENT para ficar automático, pense em automatizar ao máximo.

Alterar a página para buscar estes produtos quando o cara por no carrinho.

--

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.