Ir para conteúdo
Fórum Script Brasil
  • 0

Consulta Complicada


Wallcrawler

Pergunta

Meu primeiro post no scriptbrasil!

Bom galera o meu problema é o seguinte:

Tenho uma tabela de votação, que é montada desse jeito:

DROP TABLE IF EXISTS `votacao_1`;

CREATE TABLE `votacao_1` (
  `int_voto` int(11) NOT NULL AUTO_INCREMENT,
  `coduser` varchar(20) NOT NULL,
  `uf` varchar(2) NOT NULL,
  `cel_number` varchar(10) NOT NULL,
  `cod_operadora` varchar(10) NOT NULL,
  `data_voto` datetime NOT NULL,
  PRIMARY KEY(`int_voto`),
  CONSTRAINT `Ref_05` FOREIGN KEY (`coduser`)
    REFERENCES `tbl_participantes`(`coduser`) ON DELETE NO ACTION ON UPDATE NO ACTION
)
ENGINE=INNODB
CHARACTER SET latin1 
COLLATE latin1_general_ci ;
Que possui cerca de 5000 registros. Gostaria de montar um select que trouxesse: o coduser, a qtd de votos total por coduser, e a qtd de votos absolutos (únicos). Estou usando o seguinte select, que me atende em 80% do que eu quero:
select coduser as usu, count(*) as votos, (select distinctrow count(*) from votacao_1 a where a.coduser = usu) as votos_absolutos from votacao_1 group by coduser order by votos desc, votos_absolutos asc

Ela me traz o coduser, o total de votos, mas não traz a qtd de votos absolutos, ou melhor dizendo, ele me traz como votos absolutos, a mesma quantidade dos votos totais.

Estou aqui queimando as pestanas pra tentar resolver. :-)

Se vocês puderem me dar uma luz de como faço isso, fico desde já agradecido.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0
Meu primeiro post no scriptbrasil!

Bom galera o meu problema é o seguinte:

Tenho uma tabela de votação, que é montada desse jeito:

DROP TABLE IF EXISTS `votacao_1`;

CREATE TABLE `votacao_1` (
  `int_voto` int(11) NOT NULL AUTO_INCREMENT,
  `coduser` varchar(20) NOT NULL,
  `uf` varchar(2) NOT NULL,
  `cel_number` varchar(10) NOT NULL,
  `cod_operadora` varchar(10) NOT NULL,
  `data_voto` datetime NOT NULL,
  PRIMARY KEY(`int_voto`),
  CONSTRAINT `Ref_05` FOREIGN KEY (`coduser`)
    REFERENCES `tbl_participantes`(`coduser`) ON DELETE NO ACTION ON UPDATE NO ACTION
)
ENGINE=INNODB
CHARACTER SET latin1 
COLLATE latin1_general_ci ;
Que possui cerca de 5000 registros. Gostaria de montar um select que trouxesse: o coduser, a qtd de votos total por coduser, e a qtd de votos absolutos (únicos). Estou usando o seguinte select, que me atende em 80% do que eu quero:
select coduser as usu, count(*) as votos, (select distinctrow count(*) from votacao_1 a where a.coduser = usu) as votos_absolutos from votacao_1 group by coduser order by votos desc, votos_absolutos asc

Ela me traz o coduser, o total de votos, mas não traz a qtd de votos absolutos, ou melhor dizendo, ele me traz como votos absolutos, a mesma quantidade dos votos totais.

Estou aqui queimando as pestanas pra tentar resolver. :-)

Se vocês puderem me dar uma luz de como faço isso, fico desde já agradecido.

Pelo que entendi cada coduser pode ter mais de um voto. Correto? e o que você define como votos_absolutos? Em sua select o group by vai trazer a quantidade de votos e votos_absolutos agrupados por usuario.

Por favor explique melhor para que possamos auxiliá-lo.

Outra coisa, para seu conhecimento. O COUNT(*) retorna o número de linhas existentes na tabela conforme os critérios de busca definidos por GROUP BY e WHERE

Link para o comentário
Compartilhar em outros sites

  • 0

Exatamente, cada candidato pode ter mais de um voto e funciona assim:

O votante é identificado pelo numero do celular de quem está enviando (a votação será via SMS).

O total de votos, é a qtd de votos que o candidato recebeu. O absoluto, é a qtd de votos únicos. Por exemplo:

Se um votante (uma única pessoa) vota 300 vezes no candidato A, o candidato A vai possuir um total de 300 votos + a qtd de votos das outras pessoas. Ou seja, todos os votos serão computados.

Mas, por ter sido votado 300 vezes por um único votante, o candidato A terá apenas um voto absoluto (único) computado. Ou seja, é a qtd de numeros de celulares diferentes de que ele recebeu votos. Isso serve como critério de desempate.

Entenderam a briga?

abraços

Editado por Wallcrawler
Link para o comentário
Compartilhar em outros sites

  • 0

Consegui resolver o impasse usando a seguinte query:

select coduser as usu, count(*) as votos, (select count(distinct cel_number) from votacao_1 a where a.coduser = usu) as votos_absolutos from votacao_1 group by coduser order by votos desc, votos_absolutos asc;

Ela traz tudo bonitinho, e usando uma subquery somente. A minha única dúvida, é quanto a perfomance dela. vocês acham que ela seria a ideal, levando em consideração que a previsão é de se receber mais ou menos 1 milhão de votos por semana?

Link para o comentário
Compartilhar em outros sites

  • 0
... A minha única dúvida, é quanto a perfomance dela. vocês acham que ela seria a ideal, levando em consideração que a previsão é de se receber mais ou menos 1 milhão de votos por semana?

Não. não seria eficiente. Talvez o melhor fosse criar uma tabela com totalização com chave única para o coduser, por exemplo (você decide que campo(s) faria(m) parte desta chave única), e você incrmentasse os votos nela a cada entrada de registros. O tempo de gravação seria o mesmo (update tabela nova = insert tabela atual) mas a quantidade de registros gerados seria bem menor. Ou seja otimizaria o tempo de consulta.

Uma select com a que está usando requer um processamento da subselect a cada linha lida na select principal.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...