{PHP/MySQL} Popularité en %

Résolu/Fermé
Jeremy_me Messages postés 31 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 24 septembre 2009 - 24 août 2009 à 00:44
Jeremy_me Messages postés 31 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 24 septembre 2009 - 3 sept. 2009 à 20:50
Bonjour,
J'ai encore une autre question...


Dans ma table, j'ai le champs 'count' qui est utilisé pour calculé la popularité de la recherche.

Comment puis-je faiire por additionner TOUT les champs 'count' puis faire le count du mot actuel divisé par le count total...

Exemple (Désolé mais bon, vous allez quand meme comprendre)
=========================
| ID | query | count |
=========================
| 1 | BOB | 1 |
| 2 | aurore le film | 24 |
=========================

Donc 1+24 = 25

La popularité de 'aurore le film' = 24/25 > 96 %

C'est le 96 % que je veux..

Ou s'il existe une méthode plus facile et moins carnivore en matière de ressources serveur..

Je vous remercie, encore :)
Et si je ne suis pas clair, n'hésité pas
A voir également:

8 réponses

P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
3 sept. 2009 à 11:43
Bonjour,

La première à chose à faire est de modifier ta table, en nommant autrement ta colonne count qui prête à confusion avec la fonction de même nom, et mettre un UNIQUE sur le terme recherché, pour pouvoir se servir du ON DUPLICATE KEY (servira à faire un update si la ligne est déjà présente lors de l'insert).

En gros ta table devrait ressembler à :
CREATE TABLE RECHERCHE (
    terme_id INT UNSIGNED AUTO_INCREMENT,
    terme VARCHAR(255) NOT NULL,
    compteur INT NOT NULL DEFAULT 1,
    PRIMARY KEY(terme_id),
    UNIQUE(terme));
Maintenant la façon dont tu insères une valeur après une recherche est à modifier aussi.
/* Un client effectue une recherche et il y a des résultats.
On insère donc la valeur ($recherche) recherchée dans la table.
$sql = "INSERT INTO RECHERCHE(terme) VALUES('" . mysql_real_escape_string($recherche) . "') 
             ON DUPLICATE KEY UPDATE compteur=compteur+1";
$query = mysql_query($sql) or exit(mysql_error());
Maintenant faire ce que tu désires peut s'effectuer de plusieurs manières, en voici une.
$sql = 'SELECT terme, compteur FROM RECHERCHE';
$query = mysql_query($sql);

$listeRecherche = array();
while( $row =  mysql_fetch_assoc($query) )
    $listeRecherche[$row['terme']] = $row['compteur'];
$total = array_sum($listeRecherche);

// Affichage des résultats et %
foreach( $listeRecherche as $terme => $cmpt )
  echo $terme . '(' . $cmpt . 'fois) : ' . ($cmpt*100/$total) . '%<br>';
En espérant avoir été clair.
1
TiboleParano Messages postés 498 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 7 avril 2015 61
24 août 2009 à 11:09
$total_o = mysql_query('SELECT SUM(count) AS resultat FROM table');
$total= $total_o['resultat'];

et après quand la valeur count de chaque filme sue tu as est divisée par $total, si j'ai bien compris
0
Jeremy_me Messages postés 31 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 24 septembre 2009 1
24 août 2009 à 21:03
Je te remercie de ta réponse. Peux-tu m'aider pour ce bout de code s'il te plait? C'est pour faire la moyenne, mais j'ai une erreur (je ne connais pas beaucoup MySQL malheureusement :( )

/////////////////// CALCUL DE LA POPULARITÉ ///////////////////////////
$total_o = mysql_query('SELECT SUM(count) AS resultat FROM searches'); // Calcul du total COUNT
$total= $total_o['resultat']; // Variable COUNT total
$row = mysql_fetch_array( $total_o );
$id_this = $row['id'];
$this_one = mysql_query("SELECT count FROM searches WHERE id = '$id_this' LIMIT 1");
$row = mysql_fetch_array( $this_one );
$total_one = $row['count']; // Variable COUNT pour ce résultat

echo $total_one."/".$total;

Et juste apres je fait la requete pour afficher le tableau :

$result = mysql_query("SELECT * FROM history WHERE ip = '$ip' ORDER BY time DESC");

Dans ce tableau, je dois utilisé les variables $total et $total_one pour chaque entré.. Mais je ne sais pas comment m'y prendre.


Sa doit être vraiment con comme erreur, mais je ne sais pas comment faire plusieurs requete pour la meme page, si je peux dire.


Un énorme merci pour l'aide!
0
Jeremy_me Messages postés 31 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 24 septembre 2009 1
25 août 2009 à 10:18
Personne pour m'aider s'il vous plait?

Merci beaucoup..
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
TiboleParano Messages postés 498 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 7 avril 2015 61
25 août 2009 à 12:02
bon je vais pas tout te faire à ta place, je vais te montrer tes erreurs:

$total= $total_o['resultat']; // Variable COUNT total ok
$row = mysql_fetch_array( $total_o ); pas ok ->$total_o, si tu reviens à la requete de départ, il recoit qu'une valeur, la somme, tout le reste du tableau n'as pas été livré avec, il faut refaire une requete
$infos= mysql_query('SELECT * FROM searches');


après la boucle pour le tableau viens toute seule, c'est une classique:
while($ligne=mysql_fetch_array($infos))
{
    et ce code se repetera pour chaque ligne dans ta BDD SQL,
    en sachant que chaque fois $ligne contiendra les infos 'ID' 'Query' et 'Count' de la ligne suivante
}


rajoute à sa la recette magique pour faire un tableau: son code en html (ou xhtml, excusez si imprécision je fais)
<table>
   <tr>//1ere ligne
       <td> cellule 1 </td>
       <td> cellule 2 </td>
   </tr>
   <tr>//2e ligne
       <td> cellule 3 </td>
       <td cellule 4 </td>
   </tr>
</table>


mélanges le tout ...

<?php
echo "<table><tr><td>id</td><td>querry</td><td>count</td></tr>";
$infos= mysql_query('SELECT * FROM searches');
while($ligne=mysql_fetch_array($infos))
{
    echo '<tr><td>'.$ligne['ID'].'</td><td>'.$ligne['querry'].'</td><td>'.$ligne['count'].</td></tr>';
}

Voilà =) ... et finalement jt'ai juste un peu maché le travail ;)
0
Jeremy_me Messages postés 31 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 24 septembre 2009 1
2 sept. 2009 à 21:34
Me revoilà!

J'y suis presque, le seul petit (?) problème c'est que les entrés en double sont afficher en double.

Donc si par exemple le mot "Papa" à été chercher 2 fois, j'ai 2 fois papa avec le % de popularité (qui est le même)

Voici mon code :
<?php
$ip = $_SERVER['REMOTE_ADDR'];
mysql_connect("localhost", "*******", "******") or die(mysql_error());
mysql_select_db("******") or die(mysql_error());


/////////////////// CALCUL DE LA POPULARITÉ ///////////////////////////
$total_o = mysql_query('SELECT SUM(count) AS cnt FROM searches'); // Calcul du total COUNT


$data = mysql_fetch_array($total_o);
$total = $data[0];

echo "<table class=\"history\"><tr><td>Mots-clés</td><td style=\"width: 200px\">Popularité</td></tr>";
$infos= mysql_query('SELECT * FROM searches, history WHERE searches.query = history.query');


while($ligne=mysql_fetch_array($infos))
{
//$priv = $ligne['private']; // Variable Privée
//if($priv == "1") { $priv = "Recherche privée"; } else { $priv = ""; } // Si privée = 1, afficher un texte
$count = $ligne['count'];
$pop = round(($count * 100 / $total)+0.1, 2);
echo '<tr><td>'.$ligne['query'].'</td><td><div class="progress">'.$pop.' %<img src="/img/progress.png" width="'.$pop.'%" height="12"></div></td></tr>';
}
echo "</table>";


?>


Comment puis-je faire en sorte que une seul des entrés double s'affiche? Merci beaucoup!
0
TiboleParano Messages postés 498 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 7 avril 2015 61
3 sept. 2009 à 10:18
déja petite question: pourquoi as-tu laissé les commentaires qui contiennet les lignes de code, elles ne sont pas utilisées ou provisoirement mises de coté ?
ensuite, expliques ce qu'est une entrée double, précise en citantr une ligne de ton code pour que je situe bien
NB: pour info, tu peux remplacer
$total_o = mysql_query('SELECT SUM(count) AS cnt FROM searches'); // Calcul du total COUNT 
$data = mysql_fetch_array($total_o);
$total = $data[0];

par
$data = mysql_fetch_array(mysql_query('SELECT SUM(count) AS cnt FROM searches'));
$total = $data[0];
0
Jeremy_me Messages postés 31 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 24 septembre 2009 1
3 sept. 2009 à 20:50
Oh mon dieu, mais c'est génial! Ohlala! Je t'adore, tu sais? ;)

J'essaie ça dans la prochaine heure et je t'en donne des nouvelles! Milles merci! (On vois bien ici, un heureux incontrôlable <:0) )

Et oui, c'est très clair, merci!!
0