Ir para conteúdo

POWERED BY:

Arquivado

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

Vilson Gabriel

[Resolvido] Agrupar Registros com o mesmo valor na tabela

Recommended Posts

Troque o echo $total pelo seguinte, para que possamos analisar as variáveis:

 

echo '<pre>';print_r($row);echo '</pre><br />';
Array

(

[total] => 1

[somaVotos] => 1

)

 

Bem, vou dormir, amanhã volto aqui para dar uma olhada

Compartilhar este post


Link para o post
Compartilhar em outros sites

E tirando o GROUP BY?

 

$query = mysql_query('SELECT COUNT(`vt_id`) AS `total`, SUM(`vt_op_id`) AS `somaVotosOp`, COUNT(`vt_op_id`) as `contaVotosOp` FROM `votos` WHERE `vt_pq_id` = '.$idEnquete) or die(mysql_error());

Algum valor correto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Notice: Undefined index: somaVotos in C:\wamp\www\radiosintonize\teste.php on line 10

 

Array

(

[total] => 5

[somaVotosOp] => 9

[contaVotosOp] => 5

)

 

 

 

Nossa, acho que o sono ta afetando minha cabeça...

 

Assim o Total esta pegando certo, o conta esta omesmo valor de total e o somo esta somando os ids...

 

Assim o Total esta pegando certo, o conta esta omesmo valor de total e o somo esta somando os ids...

Compartilhar este post


Link para o post
Compartilhar em outros sites

rs, então vá dormir e veja amanhã com calma. Descanso é o melhor que qualquer programador pode dar à sua mente.

Falta pouco para o resultado ficar correto. Apenas verifique os valores do print_r depois. Também estou indo dormir.

 

EDIT: mas quais valores deveriam aparecer? poste os valores do MySQL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

E os valores do campo vt_op_id são diferentes

4 são = a 2

e 1 = a 1

 

=/

 

Ok, boa noite, vou dormir B)

 

Voltei

 

Imagem Postada

Aqui esta minha tabela, o ultimo registro esta com a data diferente pois mudei a formato de enviar a data.

Ah, explicando os campos da tabela:

vt_id = id do voto, auto increment

vt_data = pega a data e hora que o registro foi inserido, mas esta 3 horas a frente ¬¬

vt_ip = pega o ip de quem inseriu o registro

vt_op_id = id da resposta escolhida

vt_pq_id = id da pergunta em que a resposta está

Compartilhar este post


Link para o post
Compartilhar em outros sites

E os valores do campo vt_op_id são diferentes

4 são = a 2

e 1 = a 1

 

=/

 

Ok, boa noite, vou dormir B)

 

Voltei

 

Imagem Postada

Aqui esta minha tabela, o ultimo registro esta com a data diferente pois mudei a formato de enviar a data.

Ah, explicando os campos da tabela:

vt_id = id do voto, auto increment

vt_data = pega a data e hora que o registro foi inserido, mas esta 3 horas a frente ¬¬

vt_ip = pega o ip de quem inseriu o registro

vt_op_id = id da resposta escolhida

vt_pq_id = id da pergunta em que a resposta está

 

Alguem?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo.

 

Para que você possa resolver seu problema com mais agilidade, vou te passar outro tipo de resolução, em PHP. Veja bem:

 

SELECT
    `e`.`id` as `idEnquete`,
    `e`.`nomeEnquete` as `nome`,
    `v`.`vt_data` as `data`,
    `v`.`vt_ip` as `ip`,
    `v`.`vt_op_id` as `opId`,
    `v`.`vt_pq_id` as `pqId`,
    COUNT(`v`.`vt_op_id`) as `contaOpId`,
    SUM(`v`.`vt_op_id`) as `somaOpId`
FROM `enquete` as `e`
LEFT JOIN `votos` as `v` ON
    `pqId` = `idEnquete`

Dê um print_r agora como te passei lá em cima, e cole aqui o resultado. Dependendo do resultado, podemos somar com o próprio PHP, utilizando funções como array_sum e outras.

 

Depois teste sem COUNT e SUM e compare o resultado:

 

SELECT
    `e`.`id` as `idEnquete`,
    `e`.`nomeEnquete` as `nome`,
    `v`.`vt_data` as `data`,
    `v`.`vt_ip` as `ip`,
    `v`.`vt_op_id` as `opId`,
    `v`.`vt_pq_id` as `pqId`
FROM `enquete` as `e`
LEFT JOIN `votos` as `v` ON
    `pqId` = `idEnquete`

Estou no aguardo.

 

OBS: Utilizei como base nessa query uma segunda tabela, onde possui as enquetes cadastradas.. você tem q adaptar. você nao passou ela, entao usei valores inventados. Mas é pouca coisa q tem q editar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

São alias, ou apelidos à colunas ou tabelas da Query.

 

Veja que chamo o FROM `enquete` e logo em seguida coloco: as `e`. Isso significa que se eu falar pro Mysql: `e`, é pra ele entender que é o mesmo que `enquete`.

Quando trabalhamos com mais de uma tabela na mesma query, uma boa prática é colocar o nome da tabela antes da coluna, por exemplo: `votos`.`vt_ip`, mas fazer isso com apenas uma letra fica mais fácil. Daí: `v`.`vt_ip`.

 

Você está utilizando prefixos antes das colunas, isso é bom, e tira a "necessidade" de utilizar o nome da tabela antes da coluna, porém a prática ainda sim é válida.

 

Dica: use nomes mais sugestivos para suas colunas. vt_pq_id não sugere nada, mas vt_PerguntaID sim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cole toda a Query. Fique atento para a alias que você deu. Se o alias é `e`, entao é assim:

 

`v`.`vt_pq_id` = `e`.`pq_id`

Esqueci que o nome da coluna ID pra você tem o prefixo pq_. Verifique apenas se todos os alias estão certos, que tem que funcionar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cole toda a Query. Fique atento para a alias que você deu. Se o alias é `e`, entao é assim:

 

`v`.`vt_pq_id` = `e`.`pq_id`

Esqueci que o nome da coluna ID pra você tem o prefixo pq_. Verifique apenas se todos os alias estão certos, que tem que funcionar.

 

Pois é tinha esquecido de por o pq_ hehehe, enfim o print saiu assim:

Array

(

[idEnquete] => 2

[nome] => O que você achou do novo site?

[data] => 13-09-2010

[ip] => 127.0.0.1

[opId] => 2

[pqId] => 2

[contaOpId] => 8

[somaOpId] => 28

)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pronto amigo. Agora você possui o número de votos para esta pergunta e o valor total.

Era isso que você precisava, não?

 

Quer ver um teste pegando todas as perguntas? Basta trocar o print_r por um while:

 

$con = mysql_query('select...');
while ($x = mysql_fetch_assoc($con)) {
  echo '<pre>';print_r($x);echo '</pre><br />';
}

Mude somente o $con para a variável que possui a consulta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

Está aí a resposta para o problema. Utilizei várias querys, porém a edição é bem mais fácil, a perda em performance é insignificante, e o resultado é acima do esperado.

 

$sql = ((int)$_GET['id']>0) ? 'WHERE `pq_id`='.(int)$_GET['id'] : null;
$query = mysql_query('SELECT `pq_id` as `idEnquete`, `pq_pergunta` as `pergunta` FROM `pergunta` '.$sql.' ORDER BY `pergunta` ASC');
while ($x = mysql_fetch_assoc($query)) {
	echo '<b>'.$x['pergunta'].'</b>';
	$queryx = mysql_query('SELECT `op_id` as `opId`, `op_valor` as `opcao` FROM `opcao` WHERE `op_pq_id` = '.$x['idEnquete']);
	while ($y = mysql_fetch_assoc($queryx)) {
		echo '<br />'.$y['opcao'];
		$totalVotos = mysql_query('SELECT COUNT(`vt_id`) FROM `votos` WHERE `vt_pq_id` ='.$x['idEnquete']);
		$total = mysql_fetch_row($totalVotos);
		$queryz = mysql_query('SELECT COUNT(`vt_op_id`) as `contaVotosOpcao` FROM `votos` WHERE `vt_op_id` = '.$y['opId']);
		$z = mysql_fetch_assoc($queryz);
		$porc = round(($z['contaVotosOpcao']*100)/$total[0]);
		echo ' <b>'.$z['contaVotosOpcao'].' votos</b> - '.substr($porc,0,2).'%';
	}
	echo '<br /><br />';
}

Resultado:

 

O que você achou do novo site?

Ótimo! 2 votos - 33%

Bom! 4 votos - 67%

Razoavel 0 votos - 0%

Ruim 0 votos - 0%

Isso é um site? 0 votos - 0%

 

Você gostaria de um programa de rap nacional?

Sim! 1 votos - 50%

Talvez 0 votos - 0%

Não 1 votos - 50%

 

 

Abraço!

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.