la requete qui se rebelle

la requete qui se rebelle - SQL/NoSQL - Programmation

Marsh Posté le 21-02-2005 à 09:02:38    

Voilà mon probleme :
Il est possible (enfin quand ça marchera) sur mon site de voter pour sa station de ski favorite. Le tout rentre dans la table suivante :
 
table stations
id int(11) primary key auto_increment;
station varchar(128);
ip int(10);
date date;
 
Je voudrai une requete qui me rende le nom de la station et le nombre de vote pour cette dernière. Le tout dans l'ordre décroissant. J'ai dejà demandé sur plusieurs forum et personne n'a pu m'aider.  
Si quelqu'un avait idée ?

Reply

Marsh Posté le 21-02-2005 à 09:02:38   

Reply

Marsh Posté le 21-02-2005 à 09:08:18    

SELECT station, COUNT(*) As nbVotes
FROM stations
GROUP BY station
ORDER BY COUNT(*) DESC
 
c'est ça ce que tu veux ? :??:

Reply

Marsh Posté le 21-02-2005 à 09:14:53    

remarque : enregistrer l'IP d'un visiteur est soumis à l'aval de la CNIL

Reply

Marsh Posté le 21-02-2005 à 09:16:40    

nbVotes correspond à quoi ? Il faut le calculer non ?
C'est l'addition de toutes les valeurs identiques dans la colonne station. C'est pas SUM station ?

Reply

Marsh Posté le 21-02-2005 à 09:17:33    

va falloir réviser ton SQL
COUNT c'est pour compter
SUM c'est pour additionner

Reply

Marsh Posté le 21-02-2005 à 09:18:09    

Reply

Marsh Posté le 21-02-2005 à 09:22:00    

C'est gentil mais ton lien est tout en anglais. SQL je l'ai appris à la fac y a 2 ans alors du coup je me rappelle pas de tout... Mais tout ça repond pas à ma question. C'est quoi nbVotes ?

Reply

Marsh Posté le 21-02-2005 à 09:26:08    

4emedimension a écrit :

C'est gentil mais ton lien est tout en anglais. SQL je l'ai appris à la fac y a 2 ans alors du coup je me rappelle pas de tout... Mais tout ça repond pas à ma question. C'est quoi nbVotes ?


 
nbVotes c'est le résultat du COUNT, c'est-à-dire pour chaque station identique dans la base le nombre de lignes correspondantes ;)

Reply

Marsh Posté le 21-02-2005 à 09:26:47    

OK, merci Yonel. Je vais aller voir si ça marche.

Reply

Marsh Posté le 21-02-2005 à 14:35:18    

Ca ne marche pas !
 
Erreur SQL !
SELECT id FROM stations
Invalid use of group function  
 
Mon site est hebergé par multimania. Est ce que ça change quelque chose ?

Reply

Marsh Posté le 21-02-2005 à 14:35:18   

Reply

Marsh Posté le 21-02-2005 à 15:57:10    

Erreur SQL !  
SELECT id FROM stations  
Invalid use of group function  
 
=> C quoi l'ordre SQL initial ?

Reply

Marsh Posté le 21-02-2005 à 19:43:27    

J'ai 2 requetes :
 
$sql = "SELECT id FROM stations";
Pour le nombre de participants.
 
$sql2 = "SELECT station, COUNT(*) As nbVotes  
 FROM stations  
 GROUP BY station  
 ORDER BY COUNT(*) DESC ";
Pour voir le détail des votes suivant chaque station.
 
Je sais pas si j'ai repondu à ta question.
Au fait comment fait on pour que $sql2 rende un tableau de 2 colonnes avec dans la première le nom de la station et dans la seconde le nb de vote pour cette dernière ?

Reply

Marsh Posté le 22-02-2005 à 07:39:19    

Je connais pas Mysql mais niveau syntaxe Sql
ça me parait Ok
 
Tu peux aussi essayer ça
=>
SELECT station, COUNT(*) As nbVotes  
 FROM stations  
 GROUP BY station  
 ORDER BY 2 DESC  
 
Le 2 indiquant que tu veux trier sur le 2 ème champ
du select ... au cas ou le count(*) dans ton Order by poserait pb ?!
Sinon tu peux poser ta question là  
=> http://www.developpez.com/
(dans le forum approprié)
 

Reply

Marsh Posté le 22-02-2005 à 09:30:44    

[quote=988064,0,7,224955]C'est gentil mais ton lien est tout en anglais. SQL je l'ai appris à la fac y a 2 ans alors du coup je me rappelle pas de tout... Mais tout ça repond pas à ma question. C'est quoi nbVotes ?[/quote] Programmation rime avec Anglais ;)


Message édité par FlorentG le 22-02-2005 à 09:30:52
Reply

Marsh Posté le 22-02-2005 à 13:21:41    

Je me demande si mon probleme ne vient pas de l'affichage du résultat.  
Voilà ce que me propose qq'un d'autre sur un forum :
 
$sql2 = "SELECT SUM(id) AS nb, station FROM stations ORDER BY station ASC";  
while ($row = mysql_fetch_row(mysql_query($sql2))) {  
   echo "La station ".$row[1]." à reçu ".$row[0]." votes<br>\n";  
}  
 
Mais quand je met ce qu'il me propose rien n'apparais comme résultat. Quand je met la requete :  
 
SELECT station, COUNT(*) As nbVotes    
 FROM stations    
 GROUP BY station    
 ORDER BY 2 DESC  
 
J'ai un probléme avec le while qui tourne indéfiniment. J'ai essayé de mettre while ($row != mysql_fetch_row(mysql_query($sql2)))
mais ça change rien...
 
Je suis en train de craquer !!!!!

Reply

Marsh Posté le 22-02-2005 à 13:29:59    

SELECT SUM(id) AS nb, station FROM stations ORDER BY station ASC
 
Cette requête là n'est pas bonne. Ca additionne les id de ta table, ce qui ne veut rien dire.
Si t'as 3 enregistrements avec les id auto incrémentés 1,2,3 tu obtiens 6...

Reply

Marsh Posté le 22-02-2005 à 13:32:57    

SELECT station, COUNT(*) As nbVotes FROM stations GROUP BY station ORDER BY 2 DESC    
 
Celle là est correcte ;)
Par contre ton affichage du résultat n'est pas bon.
 
J'suis pas un maitre de mysql mais essaye plutôt quelque chose comme ça :
 
$result = mysql_query("SELECT station, COUNT(*) As nbVotes FROM stations GROUP BY station ORDER BY 2 DESC" )
while($row = mysql_fetch_row($result) {
echo ...
}
 
Dans ton affichage tu appelles à chaque fois la fonction mysql_query qui exécute la requête.
Donc à chaque boucle tu affiches la 1ère ligne du résultat, et c'est sans fin !


Message édité par Vinx le 22-02-2005 à 13:33:52
Reply

Marsh Posté le 22-02-2005 à 13:37:56    

Je viens de refaire un test avec :
 
  $sql2 = "SELECT COUNT(*),station As nbVotes    
     FROM stations    
     GROUP BY station    
     ORDER BY 2 DESC";  
  while ($row = mysql_fetch_row(mysql_query($sql2))) {  
     echo "La station ".$row[1]." à reçu ".$row[0]." votes<br>\n";  
  }
 
Ca marche presque. Il y a juste une erreur avec le "while". On arrive pas a sortir de la boucle.

Reply

Marsh Posté le 22-02-2005 à 13:46:07    

c'est logique, tu refais la requete a chaque fois que tu boucle :o
faut sortir le mysql_query hors de la condition...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 22-02-2005 à 13:48:35    

[quote=989759,0,18,224955]Je viens de refaire un test avec :
 
  $sql2 = "SELECT COUNT(*),station As nbVotes    
     FROM stations    
     GROUP BY station    
     ORDER BY 2 DESC";  
  while ($row = mysql_fetch_row(mysql_query($sql2))) {  
     echo "La station ".$row[1]." à reçu ".$row[0]." votes<br>\n";  
  }
 
Ca marche presque. Il y a juste une erreur avec le "while". On arrive pas a sortir de la boucle.[/quote]
 
Zieute ma réponse juste avant
Remplace $sql2 = "SELECT ... par $sql2 = mysql_query("SELECT ...
et mysql_fetch_row(mysql_query($sql2)) par mysql_fetch_row($sql2)

Reply

Marsh Posté le 22-02-2005 à 14:02:12    

Ca y est ca marche !!!
Je tiens a remercier tout ceux qui m'ont aider.
Et je met ci dessous mon exemple (qui marche) pour tout ceux qui cherche (et qui chercherons) une telle requete et son affichage :
 
  $sql = "SELECT id FROM stations";
  $requete = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
  $nombre = mysql_num_rows($requete);
  echo "$nombre personnes ont voté.";
  $result = mysql_query("SELECT station, COUNT(*) As nbVotes FROM stations GROUP BY station ORDER BY 2 DESC" );
     while($row = mysql_fetch_row($result)) {  
   echo "La station ".$row[1]." à reçu ".$row[0]." votes<br>\n";  
 }

Reply

Marsh Posté le 23-02-2005 à 11:57:31    

Indépendamment du code, si c'est l'utilisateur qui saisit lui même sa station, il faut penser qu'une même station peut être écrite de plusieurs manières différentes : Casse (Majucules/Minuscules), trait d'union, espaces...
 
Si une personne saisit "Chamonix" et une autre "chamonix" ou "CHAMONIX" ou " Chamonix "... ça fera 2 stations différentes dans ta requête ;)

Reply

Marsh Posté le 23-02-2005 à 14:13:33    

Pas de problème pour ça. Dans mon formulaire on choisit la station à l'aide de bouton de type radio. Donc de ce coté là c'est bon.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed