Ir ao conteúdo

Conta Clicks - Exibir linhas repetidas uma só vez e somar


pedrokampos

Posts recomendados

Postado

Boa noite pessoal! estou com uma dúvida quando à exibicão de um tabela, que tem a funcão de armazenar os produtos, de minha loja virtual, visualizados.

A minha Tabela possui essas colunas seguintes:

- id (auto increment)

-produto

-ip

-data

-clicks

O que eu quero é listar como na seguinte comparacão:

título: total de clicks por produto.(ordem de maior pra o menor)

|produto|clicks|

|Sapato||330|

|Saia||203|

|Escova||169|

Contudo, porém, todavia... há problemas pois na tabela há muitas linhas repetidas tanto de PRODUTOS como de IP e de DATA. E teria também que somar o numero de CLICKS dos repetidos.

Alguém tem alguma diretriz , ideia que solucione meu problema? :/

Agradeço desde já!

"LUTEM E CONTINUEM LUTANDO! ATÉ CORDEIROS VIRAREM LEÕES..."

  • Moderador
Postado

Olá,

Provavelmente tem N formas de resolver isso:

1- Usando a linguagem de programação.. ex: Php

Desse jeito.. poderias pegar cada registro por IP e por produto e somar o campo clicks..

Nessa maneira, podes implementar uma função que a cada click por IP e Produto, o campo click da tabela seja incrementado em 1.

Eu particularmente prefiro esta maneira.

2- Usar as funções matemáticas do sql por exemplo: sum() ou avg()

No caso do avg() poderias tirar a média de clicks por IP e por poduto.

Talvez uma terceira opção é criar uma tabela espelho fazendo as operações matemáticas... e inserindo já o resultado ... depois seria só fazer uma consulta simples nesta tabela espelho.

Postado
Olá,

Provavelmente tem N formas de resolver isso:

1- Usando a linguagem de programação.. ex: Php

Desse jeito.. poderias pegar cada registro por IP e por produto e somar o campo clicks..

Nessa maneira, podes implementar uma função que a cada click por IP e Produto, o campo click da tabela seja incrementado em 1.

Eu particularmente prefiro esta maneira.

2- Usar as funções matemáticas do sql por exemplo: sum() ou avg()

No caso do avg() poderias tirar a média de clicks por IP e por poduto.

Talvez uma terceira opção é criar uma tabela espelho fazendo as operações matemáticas... e inserindo já o resultado ... depois seria só fazer uma consulta simples nesta tabela espelho.

Opa amigo!

Eu utilizo, como você havia sugerido, php e ajax p/ conectar com o banco de dados.

Essa terceira opção é bem interessante, mas como eu vou ter que fazer diversas operações com esses dados(relatórios) . Então acaba sendo inviável porque teria que criar outras tabelas p efetuar outras operações.

No caso eu vou ter que fazer a operação toda em SQL mesmo, no caso da sua segunda sugestão. Só que tá bem complicado, pois poucas pessoas conhecem bem o SQL.

Tu sabe como seria o comando p isolar as linhas repetidas(repetidas só na coluna 'produto') e somar o valor da coluna 'clicks' da mesma?

porque daí eu desenrolaria tudo!!

valeu pwla atencao. abração

Postado
Olá,

Provavelmente tem N formas de resolver isso:

1- Usando a linguagem de programação.. ex: Php

Desse jeito.. poderias pegar cada registro por IP e por produto e somar o campo clicks..

Nessa maneira, podes implementar uma função que a cada click por IP e Produto, o campo click da tabela seja incrementado em 1.

Eu particularmente prefiro esta maneira.

2- Usar as funções matemáticas do sql por exemplo: sum() ou avg()

No caso do avg() poderias tirar a média de clicks por IP e por poduto.

Talvez uma terceira opção é criar uma tabela espelho fazendo as operações matemáticas... e inserindo já o resultado ... depois seria só fazer uma consulta simples nesta tabela espelho.

Opa amigão eu consegui, fiquei mexendo aqui e funcionou assim:

SELECT produto,SUM(clicks) AS total FROM tabela1 GROUP BY produto ORDER BY total DESC

e ficou perfeito. Mérito à você.

Mas na verdade eu tenho 2 tabelas que contam cliques, uma pra visitantes e outra pra clientes. a diferenca das duas é que a de clientes tem a mais a coluna 'id_cliente'.

aí o que eu tentei fazer:

chamar as duas tabelas numa query, listar de maneira que evite repeticoes e nas mesmas repeticoes somar os cliques.

aí quase consegui assim:

SELECT v.*, c.*, SUM(v.clicks + c.clicks) AS total FROM tabela1 v, tabela2 c WHERE v.produto = c.produto GROUP BY v.produto,c.produto ORDER BY total DESC

só que ele não soma corretamente e não adiciona uma linha diferente, por exemplo: se tiver banana na tabela1 e não tiver na tabela2 ele não lista.

Tens alguma ideia de como faz? Abracão mestre!

  • Moderador
Postado

Bem,

Como eu não entrei em detalhes, é normal achar que teria que criar outras tabelas.

vou entrar um pouco mais adentro desse assunto.

No mysql pelo menos, podes criar tabelas espelhos. estas "TE" podem ser chamadas de "View" e são tabelas criadas a partir de uma consulta.

por exemplo:


CREATE VIEW relatorios AS
SELECT [B]DISTINCT[/B] qtd,
valor,
[B]qtd*valor[/B]
AS total
FROM itensVenda

Isto geraria automaticamente uma tabela chamada relatorios que conteria os seguintes registros:



+------+---------+-------+
| qtd | valor | total |
+------+---------+-------+
| [B] 3[/B] | [B]50[/B] | [B]150[/B] |
+------+---------+-------+

Nesse caso a consulta ficaria:


SELECT * FROM relatorios

Nas views, você não poderá inserir dados ou deletar manualmente... pois como se trata de um espelho..

Mas, os dados serão alterados, inseridos ou deletados.. caso mexas na tabela original.

Respondendo uma pergunta anterior, a palavra DISTINCT é usada para "isolar" os diferentes e mostra-los.

exemplo:


SELECT DISTINCT cidades FROM usuarios

Retornaria todas as cidades diferentes, ignorando as repetidas.

Então.. juntando isso com as funções matemáticas.. pode ser que funcione.

Nota1: vi tua complementação de que tinha conseguido depois que eu escrevi este post.

Nota2: com base no seu SQL que funcionou , podes criar uma VIEW e nesta VIEW, fazer uma consulta fazendo um novo calculo.( não testei, mas pode ser que funciona)

Postado
Bem,

Como eu não entrei em detalhes, é normal achar que teria que criar outras tabelas.

vou entrar um pouco mais adentro desse assunto.

No mysql pelo menos, podes criar tabelas espelhos. estas "TE" podem ser chamadas de "View" e são tabelas criadas a partir de uma consulta.

por exemplo:


CREATE VIEW relatorios AS
SELECT [B]DISTINCT[/B] qtd,
valor,
[B]qtd*valor[/B]
AS total
FROM itensVenda

Isto geraria automaticamente uma tabela chamada relatorios que conteria os seguintes registros:



+------+---------+-------+
| qtd | valor | total |
+------+---------+-------+
| [B] 3[/B] | [B]50[/B] | [B]150[/B] |
+------+---------+-------+

Nesse caso a consulta ficaria:


SELECT * FROM relatorios

Nas views, você não poderá inserir dados ou deletar manualmente... pois como se trata de um espelho..

Mas, os dados serão alterados, inseridos ou deletados.. caso mexas na tabela original.

Respondendo uma pergunta anterior, a palavra DISTINCT é usada para "isolar" os diferentes e mostra-los.

exemplo:


SELECT DISTINCT cidades FROM usuarios

Retornaria todas as cidades diferentes, ignorando as repetidas.

Então.. juntando isso com as funções matemáticas.. pode ser que funcione.

Nota1: vi tua complementação de que tinha conseguido depois que eu escrevi este post.

Nota2: com base no seu SQL que funcionou , podes criar uma VIEW e nesta VIEW, fazer uma consulta fazendo um novo calculo.( não testei, mas pode ser que funciona)

Amigo consegui!! :D esse CREATE VIEW é mt bacana. No final do comentário eu posto minha solução p/ outros estudarem. Muito obrigado mesmo!

Mas antes, tenho que te dizer que tenho um certo receio de saber disso porque assim como facilita sua vida pode dificultar, no caso de inflacionar o banco de dados.

Veja meu caso, eu tenho 2 tabelas ambas recebem informações sobre CLIQUES de produtos de minha loja virtual, de clientes e de visitantes.

Cada um dessas tabelas possuem a tabela (IP/ou/ID_CLIENTE, ID_PRODUTO, DATA, CLIQUES), a cada ip/id ou data diferentes é acrescentado uma nova linha, linhas com dados iguais são acrescentados de 1.

Fico pensando daqui há alguns meses vou ter milhares de linhas, vou fazer uma funcão pra ficar apagando há cada 1 ano. Mas não sei...

será que vou ter problemas com isso? :/

Abração amigo!

SOLUCAO-------------------------------------------------------------------


SELECT v.id_produto, v.total, c.total, c.id_produto, SUM(ifnull(v.total,0)+ifnull(c.total,0)) AS totalidade
FROM v
LEFT JOIN c
ON v.id_produto = c.id_produto
GROUP BY v.id_produto, c.id_produto

UNION

SELECT v.id_produto, v.total, c.total, c.id_produto, SUM(ifnull(v.total,0)+ifnull(c.total,0)) AS totalidade
FROM v
RIGHT JOIN c
ON v.id_produto = c.id_produto
GROUP BY v.id_produto, c.id_produto
order by totalidade desc

obs: C e V são table view. criadas ambas com instrucão:


SELECT id_produto,SUM(clicks) AS total FROM conta_click_produtos GROUP BY id_produto ORDER BY total DESC

E


SELECT id_produto,SUM(clicks) AS total FROM conta_click_produtos_visitantes GROUP BY id_produto ORDER BY total DESC

Com base no seu exemplo dos VIEW eu tive uma ideia, pensei um pouco e consegui fazer o que eu queria, o código, com mesmas funcão, porém independente de tabelas. hehehe, fica até melhor para eu administrar as datas e tal... mt obrigado mesmo mestre. Isso pra mim foi mesmo que ouro! aprendi bastante!


SELECT v.id_produto, v.total, c.total, c.id_produto, SUM(ifnull(v.total,0)+ifnull(c.total,0)) AS totalidade

FROM (SELECT id_produto,SUM(clicks) AS total FROM conta_click_produtos_visitantes GROUP BY id_produto ORDER BY total DESC) AS v

LEFT JOIN (SELECT id_produto,SUM(clicks) AS total FROM conta_click_produtos GROUP BY id_produto ORDER BY total DESC) AS c

ON v.id_produto = c.id_produto
GROUP BY v.id_produto, c.id_produto

UNION

SELECT v.id_produto, v.total, c.total, c.id_produto, SUM(ifnull(v.total,0)+ifnull(c.total,0)) AS totalidade

FROM (SELECT id_produto,SUM(clicks) AS total FROM conta_click_produtos_visitantes GROUP BY id_produto ORDER BY total DESC) AS v

LEFT JOIN (SELECT id_produto,SUM(clicks) AS total FROM conta_click_produtos GROUP BY id_produto ORDER BY total DESC) AS c

ON v.id_produto = c.id_produto
GROUP BY v.id_produto, c.id_produto
order by totalidade desc

  • Moderador
Postado

Caso o autor necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!