porao 0 Denunciar post Postado Outubro 8, 2009 Olá pessoal, tenho uma dúvida casca grossa, onde tenho quebrado a caxola e nao tem jeito de resolver. Tanto é que resolvi apelar para vcs. A duvida é a seguinte, tenho uma banco de dados assim(estrutura e valores): Tabela avaliacoes id........usuario........avaliacao.........data 8692.......916..............bom....2008-01-28 12:00:30 105.........36..............bom....2006-09-23 11:00:11 24..........27.............medio...2006-09-20 17:26:28 80...........1..............bom....2006-09-22 20:29:58 455.........45..............ruim...2006-09-22 20:29:58 3434........64..............bom....2006-09-22 20:29:58Quero fazer um SELECT nesta tabela desta forma: $xres = mysql_query("SELECT avaliacao FROM avaliacoes WHERE id = $id"); $xarr = mysql_fetch_array($xres); e imprimir a frequencia em que aparece as avaliaçoes somente com o select acima: $bom= $xarr[bom]; if ($bom>0) echo 'Existem $bom avaliaçoes com [b]bom[/b]'; //saida seria: Existe 4 avaliaçoes BOM $medio= $xarr[medio]; if ($medio>0) echo 'Existe $medio avaliaçoes com [b]medio[/b]'; //saida seria: Existe 1 avaliaçoes MEDIO $ruim= $xarr[ruim]; if ($ruim>0) echo 'Existe $ruim avaliaçoes com [b]ruim[/b]'; //saida seria: Existe 1 avaliaçoes RUIM Eu nao consegui de jeito nenhum, por favor me ajudem! Obrigado! Compartilhar este post Link para o post Compartilhar em outros sites
lucasmartins 6 Denunciar post Postado Outubro 8, 2009 função array_count_values() http://br.php.net/manual/pt_BR/function.array-count-values.php ou http://ainternetenossa.wordpress.com/2009/09/25/functions-php-uteis-parte-01/ Abraços Compartilhar este post Link para o post Compartilhar em outros sites
porao 0 Denunciar post Postado Outubro 8, 2009 Obrigado pela resposta amigo. Com sua ajuda achei esta função: <?php // Answers Array $array = array('a', 'b', 'a', 'a', 'c', 'a', 'd', 'a', 'c', 'd'); // Start Count Function function count_repeat_values($needle, $haystack){ $x = count($haystack); for($i = 0; $i < $x; $i++){ if($haystack[$i] == $needle){ $needle_array[] = $haystack[$i]; } } $number_of_instances = count($needle_array); return $number_of_instances; } echo count_repeat_values('a', $array); // will return the value 5 ?> No exemplo acima ele funciona perfeitamente, mas quando eu puxo um array do meu DB nao funcionaTo fazendo assim, usando a mesma função acima: Tabela avaliacoes id........usuario........avaliacao.........data 8692.......916..............17....2008-01-28 12:00:30 105.........36..............33....2006-09-23 11:00:11 24..........27.............33...2006-09-20 17:26:28 80...........1..............35....2006-09-22 20:29:58 455.........45..............17...2006-09-22 20:29:58 3434........64..............26....2006-09-22 20:29:58 $xres = mysql_query("SELECT avaliacao FROM avaliacoes WHERE id= $id"); $xarr = mysql_fetch_array($xres); $avalia7 = count_repeat_values('17', $xarr); No db tenho 2 registros com valor '17' so que ele so conta 1...nao to conseguindo gente, ta feia a coisa. help Será que eu nao to conseguindo transformar os registros do DB em array, para a função poder contar corretamete? Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Outubro 8, 2009 Olha, o mais fácil é fazer direto na query. Seria algo assim. SELECT COUNT('avaliacao') AS total FROM forum WHERE id = $id GROUP BY avaliacao Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
porao 0 Denunciar post Postado Outubro 8, 2009 Será amigo, eu ja tinha tentado isso, mas dai teria que fazer varias consultas..uma pra cada tipo avaliação? Lembrando que quero deixar somente uma consulta ao DB para todas as avaliaçoes. E indo direto na query será que da para colocar condiçoes? if ($xarr['17'] > 0) //se a contagem de avaliaçao 17 for maior que zero echo 'Existem $xarr['17] avaliaçoes com [b]17[/b]'; //saida seria: Existe 2 avaliaçoes 17 if ($xarr['15'] > 0) //se a contagem de avaliaçao 15 for maior que zero echo 'Existe $xarr['15'] avaliaçoes com [b]15[/b]'; //saida seria: Existe 1 avaliaçoes 15 Compartilhar este post Link para o post Compartilhar em outros sites
porao 0 Denunciar post Postado Outubro 8, 2009 Se eu troco a consulta: $xres = mysql_query("SELECT avaliacao FROM avaliacoes WHERE id= $id"); $xarr = mysql_fetch_array($xres); por: $array = array('17', '17', '55', '23', '42', '15', '567', '875', '54', '99'); funciona perfeitamente..isso que nao entendo Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Outubro 8, 2009 Edit: Tinha feito invertida a consulta. http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif É que você não passou oque deveria para o count. $xres = mysql_query("SELECT avaliacao FROM avaliacoes WHERE avaliacao= 17"); while( $xarr = mysql_fetch_assoc($xres) ){ $avaliacoes = $xarr['avaliacao'];} $avalia7 = count_repeat_values(17, $avaliacoes );ai sim, você está passando o array de avaliações Atente para o fato de precisar passar um array. A função count realmente está correta. Mas não analisei outra forma de fazer oque você quer. Tem como especificar o problema ? talvez haja outra maneira mais correta, mesmo que a que apresentei funcione. Agora que vi, oque você quer é esta consulta: $sql = "SELECT COUNT(avaliacao) AS c_avaliacao, avaliacao FROM avaliacao GROUP BY avaliacao"; $q = mysql_query($sql); while( $dados = mysql_fetch_assoc( $q ) ) echo 'Existem: '.$dados['c_avaliacao'].' avaliações com : '.$dados['avaliacao'].'<br />'; Compartilhar este post Link para o post Compartilhar em outros sites
porao 0 Denunciar post Postado Outubro 8, 2009 Isso, so que eu quero que ele so imprima a avaliação que a contagem for != de zero: No meu DB terá 5 avaliações possiveis: 11, 15, 16, 17, 18 Entao eu concatenei os resultados assim: if ($dados['c_id'] > 0);//se existir avaliaçoes com o valor 15 $ava.= "- Voce possui ".$dados['c_id']." avaliaçoes 15"; if ($dados['c_id'] > 0);//se existir avaliaçoes com o valor 14 $ava.= "- Voce possui ".$dados['c_id']." avaliaçoes 14"; echo $ava; Por isso que neste caso abaixo, como ele sabera que a avaliação foi 15? if ($dados['c_id'] > 0); $ava.= "- Voce possui ".$dados['c_id']." avaliaçoes 15"; A parada ta complicada mesmo, to desde ontem de manha tentando varias anternativas Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Outubro 8, 2009 Edit: Tinha feito invertida a consulta. http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gifOlha de novo o meu post, eu tinha feito ao contrário.http://forum.imasters.com.br/index.php?/topic/366139-contar-frequencia-de-valor-em-um-array/page__view__findpost__p__1401204 Compartilhar este post Link para o post Compartilhar em outros sites
porao 0 Denunciar post Postado Outubro 8, 2009 Nao funcionou amigo, quando ele verifica a condição if ($avalia >0) ele ja nem retorna. Vou postar exatamente o codigo aqui que to usando, eu tava tentando simplificar pra ficar mais facil de entender: Tabela avaliacoes trabalho....usuario......avaliacao.........data 8692.......916..............17......2008-01-28 12:00:30 105.........36..............14......2006-09-23 11:00:11 24..........27.............14.......2006-09-20 17:26:28 80...........1..............11......2006-09-22 20:29:58 455.........45..............17......2006-09-22 20:29:58 3434........64..............17......2006-09-22 20:29:58 //função pra contar frequencia de array function count_repeat_values($needle, $haystack){ $x = count($haystack); for($i = 0; $i < $x; $i++){ if($haystack[$i] == $needle){ $needle_array[] = $haystack[$i]; } } $number_of_instances = count($needle_array); return $number_of_instances; } Aqui o codigo php //unico select que deve ter o arquivo(com varias consultas eu consegui..mas nao é este o objetivo. //O objetivo é fazer tudo com uma consulta ao DB somente $xres = mysql_query("SELECT avaliacao FROM avaliacoes WHERE trabalho= $id"); //seleciona todas as avaliaçoes para usuario X #$xrow = mysql_fetch_array($xres); while( $xarr = mysql_fetch_assoc($xres) ){ $ids = $xarr['avaliacao'];} $avalia = count_repeat_values('15', $ids); //conta frequencia de avaliaçao 15 para o usuario X if ($avalia >0) $aval.="- Voce recebeu(<a href=avaliat.php?id=$id&tpo=17&tipo=sim><font style=\"font-weight:bold;color:green\">" . $avalia . "</font></a>) avaliações 15 ";//concatena $avalia2 = count_repeat_values('14', $ids);//conta frequencia de avaliaçao 14 para o usuario X if ($avalia2 >0) $aval.="- Voce recebeu(<a href=avaliat.php?id=$id&tpo=17&tipo=sim><font style=\"font-weight:bold;color:green\">" . $avalia2 . "</font></a>) avaliações 14 ";//concatena echo $aval;//imprime resultados Realmente é uma charada isso EDIT---------- lembrando que se eu substituo a consulta ao DB pelo codigo abaixo funciona perfeitamente...: // Answers Array $array = array('17', '17', '14', '17', '11', '11', '12', '13', '17', '18'); Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Outubro 8, 2009 Poste o SQL da sua tabela.. se id é uma chave primária, não tem como um mesmo usuário ter várias avaliações. Poste com alguns registros tb... visto que essa tabelinha não parece ter a informação real da coisa, e com ela eu não consigo simular o ambiente aqui.Exporte a tabela no SQL. Compartilhar este post Link para o post Compartilhar em outros sites
porao 0 Denunciar post Postado Outubro 8, 2009 tabela TRABALHO tinha mudado pra ID pra ficar mais facil..acabou ficando mais dificil rs vou mudar la em cima pra ficar melhor CREATE TABLE IF NOT EXISTS `avaliacoes` ( `trabalho` int(10) unsigned NOT NULL default '0', `usuario` int(10) unsigned NOT NULL default '0', `avaliacao` tinyint(3) unsigned NOT NULL default '0', `data` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`trabalho`,`usuario`), KEY `usuario` (`usuario`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; INSERT INTO `avaliacoes` (`trabalho`, `usuario`, `avaliacao`, `data`) VALUES (8692, 916, 15, '2008-01-28 12:00:30'), (105, 36, 17, '2006-09-23 11:00:11'), (24, 27, 17, '2006-09-20 17:26:28'), (80, 1, 14, '2006-09-22 20:29:58'); Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Outubro 8, 2009 Tá.. vejamos: $sql = "SELECT COUNT(avaliacao) AS c_avaliacao, avaliacao, trabalho FROM avaliacoes GROUP BY avaliacao"; $q = mysql_query($sql); while( $dados = mysql_fetch_assoc( $q ) ) echo 'Existem: '.$dados['c_avaliacao'].' avaliações : '.$dados['avaliacao'].'<br />';saida: Existem: 1 avaliações : 14 Existem: 1 avaliações : 15 Existem: 2 avaliações : 17 mas ainda não entendi oque esses dados representam.. tá me parecendo que você modelou errado, e que não era essa modelagem que você precisa. Ou tô enganado? e é esta saída que você quer? Pq na modelagem atual, não vejo como relacionar as avaliações com os trabalhos, pois o campo 'trabalho', não se repete. Compartilhar este post Link para o post Compartilhar em outros sites
porao 0 Denunciar post Postado Outubro 8, 2009 Vou testar o seu exemplo amigo vamos ver Compartilhar este post Link para o post Compartilhar em outros sites
porao 0 Denunciar post Postado Outubro 8, 2009 O que eu queria é que tivesse esta saida: Avaliações: avaliaçoes 15(3) - avaliaçoes 14(1)... Dai quando o usuario clicaria no numero de avaliaçoes(em negrito) e veria quem avaliou em uma lista. Mas se as avaliaçoes so tiverem "avaliaçoes 15" e nao tivesse nenhum outro tipo se avaliaçao, ficaria assim: Avaliações: avaliaçoes 15(3) Os outros nao apareceriam por causa de algum condicional na concatenação Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Outubro 8, 2009 confuso hein?! HAuhAuhAuhAua mas então a saída que você quer é esta mesmo, ne?! tá certo.. Qual é a dificuldade agora? com esse SQL foi gerado o: echo 'avaliações : '.$dados['avaliacao'].'<a href="leva para algum lugar">('.$dados['c_avaliacao'].')</a><br />'; só precisa então implementar o link de cada um? tenta fazer.. manda um parâmetro pra URL para iniciar a outra query.. Compartilhar este post Link para o post Compartilhar em outros sites
porao 0 Denunciar post Postado Outubro 8, 2009 AHuahHHAuahHUAUH Sim muito confuso, to com um nó da cabeça aqui To tentando com a sua dica, vamos ver se da, ja posto o resultado Compartilhar este post Link para o post Compartilhar em outros sites
porao 0 Denunciar post Postado Outubro 8, 2009 Amigo, acho que com sua dica funcionou..ACHO pq preciso testar mais com todas condiçoes para eu ter 100% de certeza. Eu so fiz algumas modificaçoes. Vou postar o codigo aqui, se alguem um dia tiver o mesmo problema que eu, espero que ajude: $xres = mysql_query("SELECT COUNT(avaliacao) AS c_avaliacao, avaliacao, trabalho FROM avaliacoes WHERE trabalho = $id GROUP BY avaliacao ORDER BY avaliacao DESC"); while($xarr = mysql_fetch_assoc($xres) ){ if ($xarr['avaliacao'] =='17'){ $tipo="Avaliaçoes 17"; $cor="green"; }elseif($xarr['avaliacao'] =='16'){ $tipo="Avaliaçoes 16"; $cor="red"; }elseif($xarr['avaliacao'] =='15'){ $tipo="Avaliaçoes 15"; $cor="red"; }elseif($xarr['avaliacao'] =='14'){ $tipo="Avaliaçoes 14"; $cor="red"; }elseif($xarr['avaliacao'] =='13'){ $tipo="Avaliaçoes 13"; $cor="red"; }elseif($xarr['avaliacao'] =='12'){ $tipo="Avaliaçoes 12"; $cor="red"; }elseif($xarr['avaliacao'] =='11'){ $tipo="Avaliaçoes 11"; $cor="red"; }else{ $tipo=""; } $ids = $xarr['c_avaliacao']; if ($ids >0) $aval.="- ".$tipo."(<a href=avaliat.php?id=$id&tpo=17&tipo=sim><font style=\"font-weight:bold;color:".$cor."\">" . $xarr['c_avaliacao'] . "</font></a>) "; ;} print("<b>Avaliação: </b><small>".$aval."</small></br>"); Vai imprimir se tiver avaliaçoes: Avaliação: Avaliaçoes 17(3) - Avaliaçoes 15(1).... Compartilhar este post Link para o post Compartilhar em outros sites
porao 0 Denunciar post Postado Outubro 8, 2009 Muitissimo obrigado amigos! ganhei o dia sem duvida! Qualquer coisa estou aiVou continuar fazendo testes neste codigo, qualquer coisa posto ai Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Outubro 8, 2009 Dá uma reestudada em php amigo.. o teu código ainda é bem confuso... veja: if( $xarr['avaliacao'] >= 17 ){ $tipo = 'Avaliaçoes 17'; $cor = 'green'; } else if( $xarr['avaliacao']<17 && $xarr['avaliacao']>=11 ) { $tipo = 'Avaliaçoes '.$xarr['avaliacao']; $cor = 'red'; } else $tipo = ''; é o mesmo que: if ($xarr['avaliacao'] =='17'){ $tipo="Avaliaçoes 17"; $cor="green"; }elseif($xarr['avaliacao'] =='16'){ $tipo="Avaliaçoes 16"; $cor="red"; }elseif($xarr['avaliacao'] =='15'){ $tipo="Avaliaçoes 15"; $cor="red"; }elseif($xarr['avaliacao'] =='14'){ $tipo="Avaliaçoes 14"; $cor="red"; }elseif($xarr['avaliacao'] =='13'){ $tipo="Avaliaçoes 13"; $cor="red"; }elseif($xarr['avaliacao'] =='12'){ $tipo="Avaliaçoes 12"; $cor="red"; }elseif($xarr['avaliacao'] =='11'){ $tipo="Avaliaçoes 11"; $cor="red"; }else{ $tipo=""; } Compartilhar este post Link para o post Compartilhar em outros sites