Ir para conteúdo

POWERED BY:

Arquivado

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

programador_master

Produtos mais clicados do dia

Recommended Posts

Fala galera do fórum, estou precisando da ajuda de vocês em um problema.

Tanho uma tabela no mysql que irá armazenar o valor de 6 produtos. Esses produtos por sua vez deverão ser selecionado por seu 'destaque', ou seja, os 6 mais clicados do dia. Como fazer essa seleção?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala galera, voltando com o tópico :) Estou com dificuldades pra desenvolver a tabela sql pra essse problema.

 

Meu sql atual está assim:

 

create table conta_cliques

`id` int(11) NOT NULL auto_increment,

`produto01` varchar(255) NOT NULL,

`produto02` varchar(255) NOT NULL,

`produto03` varchar(255) NOT NULL,

`produto04` varchar(255) NOT NULL,

`produto05` varchar(255) NOT NULL,

`produto06` varchar(255) NOT NULL,

`click` int(11) NOT NULL default '0',

PRIMARY KEY (`id`)

)TYPE=MyISAM;

 

O Andrey falou pra fazer um join na tabela produtos, até ai eu entendi, mas como eu faço pra resgatar os cliques desses produtos e armazená-los na tabela acima. Só preciso de 6 produtos amostra.

 

Pra fazer isso é bem provavél que eu tenha que usar o comando UPDAETE e somar mais um na coluna cliques, mas não to conseguindo associar essa troca. Podem me dar uma força aqui?

Compartilhar este post


Link para o post
Compartilhar em outros sites

nunca é bom você deixar uma sql com colunas fixas como da forma que você fez você limitou em 6 produtos sendo que poderia fazer assim

 

create table conta_cliques
`id` int(11) NOT NULL auto_increment,
`produtos` varchar(255) DEFAULT '0',
PRIMARY KEY (`id`)
)TYPE=MyISAM;

 

ae depois so fazer um cadastro pegando a ID que esta em auto increment

 

id -> produto

1 -> Produto 1

 

E assim por diante. So espero que você tenha entendido algo estou escrevendo isso completamente bêbado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não falei pra criar 6 campos na tabela, ou um pra cada produto .. outra coisa horrível é isso aqui

 

`produtos` varchar(255) DEFAULT '0'

 

Pra que isso .. ? grava o id do produto .. também é desnecessário uma chave auto_increment nessa tabela, você só vai precisar do código do produto e o número de visualizações, no PHP, você vai verificar se já existe um registro nessa tabela para X produto, se já existir, você vai alterar a coluna de visualizações para ( visualizações atual + 1 )

 

UPDATE `views` SET `viewsAmount` = ( `viewsAmount` + 1 ) WHERE `productID` = ? 

 

Caso não exista, você vai inserir esse produto nessa tabela, o JOIN vai ficar desta forma

 

SELECT * FROM `views` INNER JOIN `products` ON `products`.`id` = `views`.`productID` WHERE `views`.`productID` = ?

 

Essa SQL acima, vai pegar o produto cujo o id da tabela de visualizações seja Y

se você retirar o WHERE, vai pescar todos os produtos

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui, só estou tentando entender...como que os produtos mais clicados vão entrar na minha tabelas com o conta cliques??, sendo que só tenho 2 campos e nenhum deles é auto-increment? Sabendo isso teria uma lógica e um ponto de partida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, nunca .. autoIncrement neste caso não é aplicável .. pelo menos pra mim, prefira a outra idéia, grave um PRODUTO, verifique antes se o mesmo já não existe, se não existir, atualize a contagem de cliques

Compartilhar este post


Link para o post
Compartilhar em outros sites

UPDATE `views` SET `viewsAmount` = ( `viewsAmount` + 1 ) WHERE `productID` = ? 

 

Andrey só um duvida,

 

eu n uso o () para somar +1 nas minhas updates, uso direto ...SET tabela=tabela+1 WHERE...

 

isso interfere em algo ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então nesse caso eu teria que ter algum produto cadastrado na minha tabela de conta cliques, certo? Porqeu na verdade os produtos já estão na tabela 'produtos'. Agora é que são elas, eu preciso selecionar apenas 6 desses produtos usando o critério do mais clicado. Se não usar o auto_increment então tenho que ter 6 colunas diferentes, certo? Porque até onde eu sei as colunas no mysql não se 'criam' se não for designado isso antes (seria o auto_increment). Sei que estou inssistindo nessa idéia, mas é só porque é a maneira como vejo possível fazer isso ;) Seguindo sua lógica eu fico nesse inparce: como coloca os 6 produtos mais clicados da tabela 'produtos' dentro da tabela 'views'. Posso estar sendo ignorante, mas estou sendo sincero, não entendi muito bem. :ermm: Será que você poderia explicar melhor? :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo .. tenta entender

C:\Documents and Settings\Andrey Knupp Vital>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.41 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use iMasters;
Database changed
mysql> create table produtos (
   ->       id integer auto_increment ,
   ->      nome varchar ( 126 ) not null ,
   ->    primary key ( id )
   -> ) engine = myisam;
Query OK, 0 rows affected (0.09 sec)

mysql> create table cliques (
   ->       idProduto integer ,
   ->      cliques smallint ( 6 ) not null ,
   ->    unique ( idProduto )
   -> )engine = myisam;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into produtos ( nome ) values ( 'iMac' ) , ( 'iPod' ) , ( 'iPhone' ) ;
Query OK, 3 rows affected (0.05 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> insert into cliques values ( 1 , 1 ) ;
Query OK, 1 row affected (0.00 sec)

mysql> insert into cliques values ( 2 , 1 ) , ( 3 , 1 ) ;
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from cliques;
+-----------+---------+
| idProduto | cliques |
+-----------+---------+
|         1 |       1 |
|         2 |       1 |
|         3 |       1 |
+-----------+---------+
3 rows in set (0.01 sec)

mysql> update cliques set cliques = ( cliques + 1 ) where idProduto = 1 ;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from cliques ;
+-----------+---------+
| idProduto | cliques |
+-----------+---------+
|         1 |       2 |
|         2 |       1 |
|         3 |       1 |
+-----------+---------+
3 rows in set (0.01 sec)


mysql> select * from cliques inner join produtos on cliques.idProduto = produtos.id order by cliques.cliques desc limit 3;
+-----------+---------+----+--------+
| idProduto | cliques | id | nome   |
+-----------+---------+----+--------+
|         1 |       2 |  1 | iMac   |
|         2 |       1 |  2 | iPod   |
|         3 |       1 |  3 | iPhone |
+-----------+---------+----+--------+
3 rows in set (0.00 sec)

mysql>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só relembrando uma coisa... ele quer o click do dia..

 

Então você tem que lembrar de colocar a data tb.. cria um cmapo com a data e se a data for igual ao dia ele incrementa +1 e se for diferente ele inicializa a contagem com 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Andrey beleza?!...fiz o script onde tento colocar todas as idéias de maneira lógica, masss você sabe, testei aqui no localhost e retorna uma página em branco. Será que pode me dizer onde está o erro?!

 

O código ficou assim:

<?php

#Criar as váriaveis de conexão
$servidor = "";
$login    = "";
$senha    = "";
$db       = "";

#Faz a conexão e seleciona a base de dados
$conexao  = mysql_connect("$servidor","$login","$senha") or die(mysql_error());
$database = mysql_select_db($db) or die(mysql_error()); 

#Verifica se a váriavel $clique foi usada
if(isset($_POST['clique'])){

#Se foi soma +1 à quantidade de cliques do produto clicado
$atualiza_clique = "UPDATE cliques SET cliques = { cliques + 1 } WHERE idProduto = ".$id."";
}else{

#Faz um Join na tabela produtos
$busca = "SELECT * FROM cliques JOIN produtos ON cliques.idProduto = produtos.id_produto ORDER BY cliques ASC LIMIT 6;"
$executa_busca = mysql_query($busca);

#Faz o loop e armazena os valores nas variáveis
while($resultado = mysql_fetch_array($executa_busca)){
$id   = $resultado['idProduto'];
$nome = $resultado['modelo'];
?>

<!-- Lista dinâmica - o ?clique - é a marcação que cria a váriavel $clique -->
<ul>
<li><a href="<?php echo $id; ?>?clique"><?php echo $nome; ?></a></li>
</ul>

<?php }} ?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cria uma coluna contador na tabela produto, quando alguem clicar no produto tu incrementa, depois é só ordenar pela coluna contador os 6 produtos mais clicados, posteriormente usando o cronjob tu zera esses valores sempre de meia-noite por exemplo, todos os dias, para manter o contador sempre atualizado,acho q é isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza, acho que não estou conseguindo é passar o valor da variável pra poder atualizar os cliques.

Fiz o teste com isset

 

#Verifica se a váriavel $clique foi usada
if(isset($_GET['clique'])){

#Se foi soma +1 à quantidade de cliques do produto clicado
$atualiza_clique = mysql_query("UPDATE produtos SET contador = { contador + 1 } WHERE id_produto = 5 ");
}

 

e no link coloquei assim:

 

<a href="<?php echo $imagem;?>?clique=ok/"><?php echo $id_produto;?></a>

 

...mas não ta atualizando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sua SQL está errada .. faça assim

$atualiza_clique = mysql_query( "UPDATE produtos SET contador = ( contador + 1 ) WHERE id_produto = 5" );

 

Usa-se '(' ao invés de '{' ..

 

Também utilize sempre um:

or die ( mysql_error ( ) ) ; 

 

em suas consultas, quando estiver com problemas como este, aí você vai saber o porque de não estar dando certo, e conseqüentemente vai saber o problema, e arrumar !

 

;)

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.