Ir para conteúdo

POWERED BY:

Arquivado

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

paladino_php

Eita troço complicado

Recommended Posts

Você deve ter os seus produtos cadastrados no banco de dados. Depois, com um select, você resgata — através de um "fetch" — as informações do banco e com um foreach, você as lista.

 

Entendeu? :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode crer Lucas, mas é um pouco mais complexo, rs. Os critérios Bruno, são um limite por exemplo de menor preço até R$100, de 100 até R$500, de R$500 até 750. Tem que ser algo dinâmico, já que não sei os valores que a tabela vai me retornar.

 

Ah, eu já tenho uma query que lista os resultados, n sei se preciso usá-la ou faço outra query... putz complico tudo agora!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parece que o jeito é usar duas queries ou, se conseguir montar, através de uma subquery.

 

Mas sem ver a estrutura e os dados nela contidos fica difícil dizer. Porque até a parte do menor e maior valores disponíveis é tranquilo.

 

O problema seriam as faixas "do meio", que hora aumentam em 500 reais e hora aumentam à apenas 250.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bleza Bruno então vou postar a query pra facilitar na visualização do código:

 

   $_pagi_sql = "
       SELECT id_produto,descricao,garantia,modelo,id_anuncio,fabricante,MIN(preco) AS preco, COUNT(empresa) AS empresa 
       FROM anuncios LEFT JOIN produtos ON anuncios.id_produto2 = produtos.id_produto 
       LEFT JOIN categorias ON produtos.id_categoria = categorias.id1 
       LEFT JOIN subcat ON produtos.id_sub = subcat.id2 
       LEFT JOIN subcat2 ON produtos.id_sub3 = subcat2.id3 
       LEFT JOIN subcat3 ON produtos.id_sub4 = subcat3.id4 
       LEFT JOIN fabricantes ON produtos.id_fabricante = fabricantes.id 
       LEFT JOIN users ON anuncios.id_user = users.id 
       WHERE ativo = 1 AND ativado = 1 AND pendente <> 1 
       AND modelo LIKE '%" . $var_tratar . "%'
           OR descricao LIKE '%" . $var_tratar . "%'
                   OR fabricante LIKE '%" . $var_tratar . "%'
                       OR subCat LIKE '%" . $var_tratar . "%'
                           OR subCat2 LIKE '%" . $var_tratar . "%'
                               OR subCat3 LIKE '%" . $var_tratar . "%'
       GROUP BY modelo 
       ORDER BY " . $ordenar . "
       ";

 

Concordo com você que a parte do meio é mesmo a mais tensa. rs Também não consegui bolar nada ainda. Mas ve se com essa query fica fácil de elaborar uma subquery(que a propósito não sei como fazer) =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posta a estrutura do banco e alguns dados.

 

Se a query estiver errada, é mais trabalhoso identificar e consertar o erro do que fazer do zero uma já correta. :thumbsup:

 

Nesse ínterim, vou mover o tópico para SQL que o pessoal de lá pode te assessorar melhor, haja vista não ser muito um problema como PHP. Qualquer coisa, te mandam de volta ^_^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok. Mas ae Bruno, não acho que esteja errado, visto que ela me retorna os resultados corretamente. Como essa é a query principal, que me lista os produtos pesquisados, apenas pensei em incrementá-la para evitar fazer outra. Mas ai tbm vem a velocidade de execução, que não tenho certeza se tamanho, nesse caso, é documento. Mas se realmente for preciso, quais seriam as tabelas ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esses navegadores parecem ser gerados de forma estática, tipo como tabelas com valores calculados (com um cron para gerar, sei lá, de 4 em 4 horas).

 

Vejo mais como um problema de lógica de aplicação do que de SQL, mas seguem algumas dicas, não sobre o problema em si, mas relacionado.

 

Não use OR.

Monte os comandos SELECT com UNION ALL para substituir esses operadores OR.

 

Você tem um perfil de solução típico para OLTP, neste cenário seria apenas uma tabela onde pode ter todas essas informações consolidadas, desta forma você obtem uma resposta nas buscas muito mais veloz, mas muito mais veloz mesmo! Se você preferir esta estratégia você também resolve o problema dos OR e ainda pode usar um FULLTEXT INDEX para melhorar o negócio. :)

 

Exemplo de pode seus SQL pode ficar:

SELECT id_produto,descricao,garantia,modelo,id_anuncio,fabricante, maior_preco, menor_preco
       FROM busca_produto 
       WHERE MATCH (busca) AGAINST ('" . $var_busca . "' IN BOOLEAN MODE);
         AND ativo = 1 AND ativado = 1 AND pendente <> 1 -- flags alterados usando triggers
       GROUP BY modelo -- não entendi isso aqui, mas resolvi manter
       ORDER BY " . $ordenar . "

 

Se precisar de ajuda quanto a este assunto pode abrir outro tópico se achar pertinente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esses navegadores parecem ser gerados de forma estática, tipo como tabelas com valores calculados (com um cron para gerar, sei lá, de 4 em 4 horas).

 

Vejo mais como um problema de lógica de aplicação do que de SQL, mas seguem algumas dicas, não sobre o problema em si, mas relacionado.

 

Não use OR.

Monte os comandos SELECT com UNION ALL para substituir esses operadores OR.

 

Você tem um perfil de solução típico para OLTP, neste cenário seria apenas uma tabela onde pode ter todas essas informações consolidadas, desta forma você obtem uma resposta nas buscas muito mais veloz, mas muito mais veloz mesmo! Se você preferir esta estratégia você também resolve o problema dos OR e ainda pode usar um FULLTEXT INDEX para melhorar o negócio. :)/>/>

 

Exemplo de pode seus SQL pode ficar:

SELECT id_produto,descricao,garantia,modelo,id_anuncio,fabricante, maior_preco, menor_preco
       FROM busca_produto 
       WHERE MATCH (busca) AGAINST ('" . $var_busca . "' IN BOOLEAN MODE);
         AND ativo = 1 AND ativado = 1 AND pendente <> 1 -- flags alterados usando triggers
       GROUP BY modelo -- não entendi isso aqui, mas resolvi manter
       ORDER BY " . $ordenar . "

 

Se precisar de ajuda quanto a este assunto pode abrir outro tópico se achar pertinente.

 

Olá @Prog, obrigado pela ajuda. Não ficou muito claro pra mim esta query, se puder explicar melhor. Por exemplo:

FROM busca_produto -- Aqui eu devo colocar a cont. da query?

WHERE MATCH (busca) -- O que seria o termo (busca) AGAINST ('" . $var_busca . "' IN BOOLEAN MODE);

 

GROUP BY modelo -- não entendi isso aqui, mas resolvi manter (usei para agrupar os resultados por modelo, sem isso listava o mesmo produto várias vezes. Por que existe um id único para cada anúncio mas vários produtos iguais de vendedores diferentes deste mesmo anúncio. Confuso né =/)

 

Substituindo a minha query com esses termos, deu erro. O que pode estar errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Substituindo a minha query com esses termos, deu erro. O que pode estar errado?

 

Não é possível desta forma.

Essa é a questão, para o esquema que eu coloquei como exemplo dar certo você precisa ter outra tabela, com os dados consolidados.

 

No exemplo essa tabela eu dei o nome de busca_produto. Em seguida eu fiz uma busca usando funções FULLTEXT num campo chamado busca, este campo vai ser um campo do tipo TEXT com tudo o que você deseja que seja buscável, ou seja: descricao, modelo, fabricante, subcat, subcat2 e subcat3.

 

Quantidade também deve ser um campo calculado nesta tabela.

 

Isto vai dar mais trabalho no inicio, mas o resultado final será bem melhor.

 

Exemplo para sua tabela: (não conheço os seus tipos, por isso vou chutar)

CREATE TABLE busca_produto (
 id_busca_produto BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
 id_produto INT(11) UNSIGNED NOT NULL,
 id_anuncio INT(11) UNSIGNED NOT NULL,
 maior_preco NUMERIC(15,2) NOT NULL, 
 menor_preco NUMERIC(15,2) NOT NULL,
 quantidade INT(11) UNSIGNED,
 ativo SMALLINT UNSIGNED NOT NULL DEFAULT 0, 
 ativado SMALLINT UNSIGNED NOT NULL DEFAULT 0, 
 pendente SMALLINT UNSIGNED NOT NULL DEFAULT 0,
 busca TEXT
) ENGINE=MyISAM;

ALTER TABLE busca_produto ADD FULLTEXT idx_fulltext_busca (busca);

 

E de onde os dados dessa tabela virão?

De algo como:

INSERT INTO busca_produto (id_produto, id_anuncio, menor_preco, maior_preco, quantidade, ativo, ativado, pendente, busca)
   SELECT id_produto, id_anuncio, MIN(preco) AS menor_preco, MAX(preco) AS maior_preco, COUNT(empresa) AS quantidade, ativo, ativado, pendente, CONCAT(modelo,' ', descricao,' ',fabricante,' ', garantia,' ', subCat,' ', subCat2,' ', subCat3) as busca
       FROM anuncios LEFT JOIN produtos ON anuncios.id_produto2 = produtos.id_produto 
       LEFT JOIN categorias ON produtos.id_categoria = categorias.id1 
       LEFT JOIN subcat ON produtos.id_sub = subcat.id2 
       LEFT JOIN subcat2 ON produtos.id_sub3 = subcat2.id3 
       LEFT JOIN subcat3 ON produtos.id_sub4 = subcat3.id4 
       LEFT JOIN fabricantes ON produtos.id_fabricante = fabricantes.id 
       LEFT JOIN users ON anuncios.id_user = users.id

 

Para tudo dar certo você precisa adaptar isto a sua realidade. O conteúdo desta tabela precisa ser validado em tempos determinados, que você vai definir. Isto apenas não resolve, você deve ter controle para remover itens, dessa busca, se for necessário.

 

Agora a consulta (exemplo):

SELECT id_produto,
 FROM busca_produto 
WHERE MATCH (busca) AGAINST ('+notebook +sony' IN BOOLEAN MODE);
  AND ativo = 1 AND ativado = 1 AND pendente <> 1
ORDER BY quantidate

 

PS: Desculpe qualquer erro na sintaxe, se achar alguma vou editando.

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.