Ir para conteúdo

POWERED BY:

Arquivado

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

Wallcrawler

Consulta complicada

Recommended Posts

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. http://forum.imasters.com.br/public/style_emoticons/default/grin.gif

 

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom é o seguinte:

 

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, o voto absoluto é a qtd de numeros de celulares diferentes de que ele recebeu votos. Isso serve como critério de desempate.

 

Entenderam a briga?

 

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que entendi então, a subquery ficaria:

 

(select count(distinct CAMPO_QUE_IDENTIFICA_QUEM_VOTOU) from votacao_1 a where a.coduser = usu)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, funcionou... o problema é que eu já tinha testado isso, mas creio que deva ter errado, a colocação do parêntese, etc. Show de bola! Obrigado mesmo!!

 

E com relação à performance? vcs acham que essa 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;

 

Possui uma boa perfomance para uma consulta de votos maciça? (a espectativa é de + ou - 1 milhão de votos por semana).

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.