Classement et rang

Un problème, une question sur la partie PHP des graphiques

Modérateurs : jturlier, Météo Villarzel

Répondre
JP54
Messages : 331
Enregistré le : 15 févr. 2014, 06:44
Localisation : JARNY Meurthe-et-Moselle (54) Région Lorraine
Contact :

Classement et rang

Message par JP54 » 04 oct. 2022, 17:26

Bonjour,
Je suis en train de faire un fichier qui compare la température moyenne d'octobre 2022 par rapport à la température moyenne de tous les mois d'octobre depuis le début de mes relevés en 2004. Je voudrais mettre dans un tableau la température du mois et le rang par rapport au autres mois d'octobre.
Pour ce faire, j'ai créé à l'aide d'une requête un classement de toute les températures moyennes des mois d'octobre par ordre décroissant puis avec des conditions j'indique le rang de la température du mois. Mon fichier est commandé par un monthpicker afin de pouvoir sélectionné les moi et l'année de mon choix.
Mon code

Code : Tout sélectionner

<?php
$i = 1;
$derniere_temperature =  -1;
	$sql = "SELECT Moy_T FROM noaa_mois WHERE Mois=$month ORDER BY Moy_T DESC"; 
if ($res = mysqli_query($conn, $sql)) { 
    if (mysqli_num_rows($res) > 0) { 
        while ($row = mysqli_fetch_array($res)) {
			if($derniere_temperature == $row['Moy_T'])
			{
				$y++;
				$classement = ($i - $y);
			}
			else{
				$y = 0;
				$classement = $i;
			};							
 				if(($temp_moy_mois == $row['Moy_T']) and ($classement == 1)) echo '1er record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==2)) echo '2ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==3)) echo '3ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==4)) echo '4ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==5)) echo '5ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==6)) echo '6ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==7)) echo '7ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==8)) echo '8ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==9)) echo '9ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==10)) echo '10ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==11)) echo '11ème record';				
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==12)) echo '12ème record';				
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==13)) echo '13ème record';				
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==14)) echo '14ème record';				
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==15)) echo '15ème record';				
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==16)) echo '16ème record';				
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==17)) echo '17ème record';				
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==18)) echo '18ème record';				
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==19)) echo '19ème record';								
				
			$i++;
			$derniere_temperature = $row['Moy_T'];
	    }		
        mysqli_query($conn, $sql); 
    } 
} 
mysqli_close($conn); 
?>

Moy_T est la température moyenne des mois d'octobre dans la table noaa_mois.
la varible $month est le mois que je sélectionne dans le monthpicker.
La variable $temp_moy_mois est la température moyenne du mois d'octobre 2022.
Avec ce code, mon fichier fonctionne.
Mais j'ai rencontré un problème avec le mois de février 2011. Le mois de février 2011 et le mois de février 2008 ont la même moyenne 4.44°C

Image

Févier 2011 et février 2008 sont au 9ème rang donc le 9ème record. Mais le problème, dans mon tableau s'affiche deux fois 9ème record.

Image

Donc mon code fonctionne, mais pour les mois avec des températures identiques. Comment puis-je faire pour n'avoir qu'un seul rang dans mon tableau même en cas de températures identiques. j'ai lu qu'on pouvait faire un requête pour fair un classement comme je l'ai et une sous requête pour déterminé le rang, mais je ne suis pas assez calé en php pour faire ce genre de chose.
Des idées?

Pascal
Station VP2 Weatherlink 5.8.1 VP2SQL 3.0.0.17 NOAAtable 1.0.0.30 Windows 7 Pro
http://www.meteo-jarny.com/

Avatar du membre
PascalWMR
Messages : 323
Enregistré le : 16 févr. 2014, 09:28
Localisation : CONFLANS EN JARNISY (F54800)
Contact :

Re: Classement et rang

Message par PascalWMR » 08 oct. 2022, 11:01

Salut Pascal

Je comprend pas trop ton truc là.

Tu veux sortir quoi?
Un tableau complet ou uniquement le rang d'un mois dans un tableau?

A+
Pascal
Station VP2Plus, Windows 10 64 bits,WeatherLink 6.0.5, VP2SQL, Graphiques Dynamiques à partir d'une BDD MySQL
Météo Conflans-en-Jarnisy
Image

Avatar du membre
PascalWMR
Messages : 323
Enregistré le : 16 févr. 2014, 09:28
Localisation : CONFLANS EN JARNISY (F54800)
Contact :

Re: Classement et rang

Message par PascalWMR » 08 oct. 2022, 11:49

Re

Tiens teste ça Pascal
https://www.monsite-meteo.eu//ScriptsTe ... ngJP54.php

Dans ce script, je teste le mois de janvier de cette année.
Ça tombe bien puisque il a la même température moyenne que 2015.
Également chez moi, janvier 2012 et 2016 ont aussi les mêmes températures moyennes.

Donc dans les classements, tu peux voir qu'il n'y a pas de 5ème place (puisque deux 4ème) ni de 7ème (puisque deux 6ème)

Voila le code

Code : Tout sélectionner

<?php
require ('../Scripts/PHP/mysqli_connect.php');
$tabmois = array("Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre");
$i=0;
$Rang[]=0;
$RangTest=0;
$AnEnCour=date("Y");
$sql="SELECT Moy_T, Annee, Mois FROM noaa_mois WHERE Mois=01 ORDER BY 1 DESC, 2 ASC";
$query = mysqli_query($conn,$sql);                  
while ($list=mysqli_fetch_array($query)) {
	$TmoyDuMois[$i]=$list['Moy_T']*1;
	$AnDuTmoy[$i]=$list['Annee']*1;
	$MoisDuTmoy[$i]=$list['Mois']*1;
	if($i>0 && $TmoyDuMois[$i] == $TmoyDuMois[$i-1]){
		$Rang[$i]= $Rang[$i-1];
	} else {
		$Rang[$i]= $i+1;
	}
	// le if ci-dessous sert à extraire le mois voulu de l'année en cours
	if($AnDuTmoy[$i]== $AnEnCour){
		$MoisTest='Mois de '.$tabmois[$MoisDuTmoy[$i]-1].' '.$AnDuTmoy[$i].'<br>Moyenne du mois : '.$TmoyDuMois[$i].'°C<br>Classement : '.$Rang[$i].'ème record.';
	}
	echo('Année : '.$AnDuTmoy[$i].' Température moyenne : '.$TmoyDuMois[$i].' Rang :'.$Rang[$i].'<BR>');
	$i++;
}
	echo('<br>'.'<br>'.'Par exemple pour tester le mois de Janvier de cette année.<br>En plus ça tombe bien puique chez moi 2012 et 2016 on la même temp moyenne comme 2015 et 2022<br>');
	echo($MoisTest);
mysqli_free_result($query);
mysqli_close($conn);	

?>
Edit: J'ai légèrement modifié la méthode pour déterminer le rang.
En effet, avec la 1ère méthode ($Rang[$i]=$i) cela ne fonctionnait que si seulement 2 années consécutives avait la même température moyenne.
Avec $Rang[$i]= $Rang[$i-1] le rang reste le même tant que la température moyenne ne change pas.
Modifié en dernier par PascalWMR le 08 oct. 2022, 17:13, modifié 2 fois.
Station VP2Plus, Windows 10 64 bits,WeatherLink 6.0.5, VP2SQL, Graphiques Dynamiques à partir d'une BDD MySQL
Météo Conflans-en-Jarnisy
Image

JP54
Messages : 331
Enregistré le : 15 févr. 2014, 06:44
Localisation : JARNY Meurthe-et-Moselle (54) Région Lorraine
Contact :

Re: Classement et rang

Message par JP54 » 08 oct. 2022, 11:54

Bonjour Pascal,
Je veux uniquement le rang dans le tableau suivant le mois et l’année que je sélectionne.
Je ne suis pas à la maison je te réponds de mon téléphone, je test en fin de journée
Pascal
Station VP2 Weatherlink 5.8.1 VP2SQL 3.0.0.17 NOAAtable 1.0.0.30 Windows 7 Pro
http://www.meteo-jarny.com/

JP54
Messages : 331
Enregistré le : 15 févr. 2014, 06:44
Localisation : JARNY Meurthe-et-Moselle (54) Région Lorraine
Contact :

Re: Classement et rang

Message par JP54 » 08 oct. 2022, 17:14

Je viens de tester ton code, il fonctionne parfaitement. Qu'il n'y ai pas de 5ème dans ton exemple, c'est tout à fait normal vu qu'il deux 4ème et de toute façon c'est comme ça que se font les classements.
C'est tout à fait ce que je voulais, maintenant en février 2011 ou février 2008, je n'ai qu'un rang qui s'affiche dans mon tableau, c'est parfait.

Image

Par contre tu peux me donner quelques explications sur le code. J'ai un petite question sur la requête, pourquoi

Code : Tout sélectionner

ORDER BY 1 DESC, 2 ASC
Station VP2 Weatherlink 5.8.1 VP2SQL 3.0.0.17 NOAAtable 1.0.0.30 Windows 7 Pro
http://www.meteo-jarny.com/

Avatar du membre
PascalWMR
Messages : 323
Enregistré le : 16 févr. 2014, 09:28
Localisation : CONFLANS EN JARNISY (F54800)
Contact :

Re: Classement et rang

Message par PascalWMR » 08 oct. 2022, 17:24

Re

Pascal regarde bien car on était sur le forum e même temps et j'ai modifié mon code.

Code : Tout sélectionner

SELECT Moy_T, Annee, Mois FROM noaa_mois WHERE Mois=01 ORDER BY 1 DESC, 2 ASC
1 DESC, 2 ASC c'est comme Moy_T DESC, Annee ASC
Le résultat de la requête doit être trié
1 DESC ==> Température par ordre décroissant et
2 ASC ==> Année par ordre croissant

C'est plus compact. Moins de code = Vitesse accrue.
C'est une habitude à prendre pour diminuer la longueur du code

A+
Pascal
Station VP2Plus, Windows 10 64 bits,WeatherLink 6.0.5, VP2SQL, Graphiques Dynamiques à partir d'une BDD MySQL
Météo Conflans-en-Jarnisy
Image

JP54
Messages : 331
Enregistré le : 15 févr. 2014, 06:44
Localisation : JARNY Meurthe-et-Moselle (54) Région Lorraine
Contact :

Re: Classement et rang

Message par JP54 » 08 oct. 2022, 17:30

Ok Pascal, j'ai bien compris, je prend ta remarque en compte pour mes prochaines requêtes du même type.
Je te remercie beaucoup pour ton aide
Bon WE
Station VP2 Weatherlink 5.8.1 VP2SQL 3.0.0.17 NOAAtable 1.0.0.30 Windows 7 Pro
http://www.meteo-jarny.com/

Répondre