select id d'une catégorie qui a la valeur max [RESOLU]

Eléphanteau du PHP | 16 Messages

07 oct. 2011, 17:25

bonjour je bute sur une requête
je cherche à afficher un classement de photos d'avions les plus appréciés (nb de votes) dans leur catégorie (classe)
la page concernée.

Code : Tout sélectionner

table : numero classe nb_votes 101 mirage 2000 3 230 transall 4 879 c-17 2 519 transall 1 45 C-17 3 7 Mirage2000 5 résultat escompté : 7 Mirage2000 5 230 transall 4 45 C-17 3
$result = mysql_query("SELECT classe, numero, MAX(nb_votes) FROM table
			 	          GROUP BY classe ORDER BY MAX(nb_votes) DESC LIMIT 0,6") or die(mysql_error());

while ($row = mysql_fetch_array($result)){

echo ' '.$row['numero'].'  '.$row['classe'].' '.$row['nb_votes'].' ';
avec cette requete, je suis pas loin de ce que j'aimerais
j'obtiens pour une classe donnée le vote max, mais le numéro correspond à l'image de celle qui est classée 2ème ?!
exemple: au lieu de
7 Mirage2000 5
j'ai
101 mirage 2000 5


avec celui ci (que je n'ai pas compris), j'affiche un résultat mais incomplet; genre il manque la ligne " 230 transall 4"
$result = mysql_query("SELECT t1.numero, t1.nb_votes, t1.classe  FROM table t1
						WHERE	t1.nb_votes = (SELECT MAX(t2.nb_votes) FROM table t2 WHERE t2.classe = t1.classe)
						GROUP BY classe ORDER BY MAX(nb_votes) DESC LIMIT 0,6") or die(mysql_error());

while ($row = mysql_fetch_assoc($result)){

echo ' '.$row["numero"].' '.$row["classe"].'  '.$row["nb_votes"].'  ';
merci de votre aide
Modifié en dernier par stanak le 08 oct. 2011, 19:47, modifié 2 fois.

ViPHP
xTG
ViPHP | 7331 Messages

07 oct. 2011, 18:50

Tu dois avoir un souci dans tes données. Je me suis créé une base de test avec les valeurs que tu as donné et j'obtiens le bon résultat avec la première requête. :)

Eléphanteau du PHP | 16 Messages

07 oct. 2011, 22:54

merci d'avoir essayer, mais mon exemple n'était pas assez fourni pour faire ressortir mon problème.
j'ai pris la première page de ma BDD :

Code : Tout sélectionner

numero/nb_votes/classe 1 1 G-V 2 0 Learjet 3 0 Learjet 4 0 Aviojet 5 0 Aviojet 6 0 Aviojet 7 1 C-130 8 0 Puma 9 5 CL-415 10 1 Dauphin/Dolphin/Panther 11 2 CN235 12 3 DC-3 13 2 DC-3 14 1 Mirage F1 15 3 Albatros/Alca 16 0 F-16 <--- 17 5 F-16 <--- 18 4 F-16 19 0 Chinook 20 0 A109 21 2 F24 22 5 Corsair 23 1 Fouga 24 1 Yak-18 25 4 TS-11 26 1 TS-11 27 0 An-26 28 2 Jaguar 29 2 B707 30 5 Mirage 2000
résultat:

Code : Tout sélectionner

#9 CL-415 - 5 #30 Mirage 2000 - 5 #16 F-16 - 5 #22 Corsair - 5 #25 TS-11 - 4 #12 DC-3 - 3 #15 Albatros/Alca - 3 #29 B707 - 2 #11 CN235 - 2 #21 F24 - 2 #28 Jaguar - 2 #10 Dauphin/Dolphin/Panther - 1
et là on y voit plus clair, au lieu de sélectionner le F-16 n°17 qui a 5 votes
c'est le premier F-16 qui se présente qui est sélectionné, soit le n°16

Eléphanteau du PHP | 44 Messages

08 oct. 2011, 07:50

C'est normal, un group by groupe les lignes d'une table en utilisant la 1ère ligne de la table pour chaque groupe.

Voir http://dev.mysql.com/doc/refman/5.0/fr/ ... p-row.html pour résoudre ton problème.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

08 oct. 2011, 10:18

Pour compléter ce qui a été dit, la fonction MAX() te permet de récupérer l'enregistrement qui a la plus grande valeur... hors ce que tu veux ce n'est pas connaitre la plus grande valeur, c'est trier les résultat. Dès lors, il te suffit juste d'un ORDER BY ton_champ DESC pour les trier du plus grand au plus petit :)
SELECT classe, numero, nb_votes 
   FROM table
   ORDER BY nb_votes DESC 
   LIMIT 0, 6
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 16 Messages

08 oct. 2011, 19:46

pas si simple Ryle, là ça me sort toutes les valeurs de "classe" alors que je ne veux que celle qui a le vote le plus élevé.

merci Soycd =D> son astuce "inefficace" marche très bien pour moi, et c'est pas simple #-o
$result = mysql_query("SELECT classe,
       SUBSTRING( MAX( CONCAT(LPAD(nb_votes,6,'0'),numero) ), 7) AS numero,
  0.00+LEFT(      MAX( CONCAT(LPAD(nb_votes,6,'0'),numero) ), 6) AS nb_votes
FROM   table1
GROUP BY classe ORDER BY nb_votes DESC LIMIT 0,6") or die(mysql_error());
						
						

while ($row = mysql_fetch_array($result)){

echo ' #'.$row['numero'].'  '.$row['classe'].' vote : '.$row['nb_votes']. ';