Valeur maximale d'une colonnne

Fermé
pc249 - 6 déc. 2019 à 22:04
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 - 10 déc. 2019 à 21:31
Bonjour,
je souhaite recuperer la valeur maxi dans une des 14 colonnes d'une table sql.
j'ai deja un tableau qui affiche les differentes pluviometries (années et mois).
peut-on extraire directement le resultat de la base sql sans passer par des fetch_array ?
merci si quelqu'un à une idée


Configuration: Windows / Firefox 71.0

7 réponses

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
6 déc. 2019 à 22:46
Bonjour,

En php.. oui.. tu dois obligatoirement faire un FETCH sur le résultat de ta requête si tu veux pouvoir exploiter les données.

Par contre, récupérer le MAX en sql.. il faut se pencher sur la requête SQL...
Mais sans connaitre la structure de ta BDD impossible de te répondre.
par contre... quand tu parles de 14 colonnes... ça me fait peur.... peur que ta base soit mal conçue.(très mal conçue même...) ....
bref, montre nous le contenu de ta bdd ( sa structure ET quelques données d'exemple )
L'ideal serait de nous fournir un dump. (si tu as phpmyadmin tu utilises le menu "export" et tu génères un fichier sql. Tu peux ensuite ouvrir ce fichier avec un éditeur de texte et nous coller son contenu ici;

NB: Pour poster du code sur le forum, tu devras utiliser les balises de code;
Explications disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

0
merci pour la réponse
voilà le code qui fonctionne mais sans faire ressortir la valeur maxi des annéees.
Le maxi pour les mois fonctionne bien


<table border="4" cellpadding="2" cellspacing="2"><!--Les nouveaux navigateurs affichent les en-têtes de tableau définis dans l'élément <th> en caractères gras.-->
	<thead>
<!--titre du tableau-->	
<CAPTION>Pluviométrie par année de janvier à décembre<br><br></CAPTION>
<tr>
<th BGCOLOR="#F5F5DC">Année</th><!--titre de la 1ere colonne -->
<th BGCOLOR="#ADD8E6">janv</th>
<th BGCOLOR="#C1CDC1">fév</th>
<th BGCOLOR="#ADD8E6">mars</th>
<th BGCOLOR="#C1CDC1">avr</th>
<th BGCOLOR="#ADD8E6">mai</th>
<th BGCOLOR="#C1CDC1">juin</th>
<th BGCOLOR="#ADD8E6">juil</th>
<th BGCOLOR="#C1CDC1">août</th>
<th BGCOLOR="#ADD8E6">sept</th>
<th BGCOLOR="#C1CDC1">oct</th>
<th BGCOLOR="#ADD8E6">nov</th>
<th BGCOLOR="#C1CDC1">déc</th>
<th BGCOLOR="#FFFF66">Total</th>
<th BGCOLOR="#FFCCCC">Maxi</th><!--ajout -->
<th BGCOLOR="#F5F5DC">Année</th><!--ajout année a droite-->
<th BGCOLOR="#FFFFCC">Graph</th>

</tr>
	</thead>
<?php
require($_SERVER["DOCUMENT_ROOT"]."conf.inc.php");
// Connexion au serveur
@mysql_connect($SQL_HOST, $SQL_USER, $SQL_PASSWORD) or die("erreur de connexion au serveur");
@mysql_select_db($SQL_NOM_BASE) or die("erreur de connexion a la base de donnees");

// Creation et envoi de la requete

$query = "SELECT * FROM la_pluviometrie ORDER by annee  ";//org

$result = @mysql_query($query) or die('Erreur SQL !<br />'.$result.'<br />'.mysql_error()); //arret sur erreur

$number = @mysql_num_rows($result);//affiche le nbr total d'années en bas de page

 

// Recuperation des resultats
while($row = @mysql_fetch_row($result)){ 

//$nom_colonnes = mysql_field_name($result, );

$annee = $row[1];


$mois = array('janv' => $janv = $row[2], 'fév' => $fev = $row[3], 'mars' => $mars = $row[4], 'avr' => $avril = $row[5], 'mai' => $mai = $row[6], 'juin' => $juin = $row[7], 'juil' => $juil = $row[8], 'août' => $aout = $row[9], 'sept' => $sept = $row[10], 'oct' => $oct = $row[11], 'nov' =>$nov = $row[12], 'déc' => $dec = $row[13]);
arsort($mois);
$max = current($mois);// maximun dans le mois lignes horizontales
$mois_max = key($mois);
//echo $nom ;//donne le mois de la valeur maximale
$total_par_annee = array_sum($mois) ; //lignes horizontales
//echo $total_par_annee. '<br/>';//donne le total par annee
$max_par_annee = max(array($janv, $fev, $mars, $avril, $mai, $juin, $juil, $aout, $sept, $oct, $nov, $dec));



echo "<tr>\n
<td bgcolor='#F5F5DC'>$annee</td>\n
<td bgcolor='#ADD8E6'>$janv</td>\n
<td bgcolor='#C1CDC1'>$fev</td>\n
<td bgcolor='#ADD8E6'>$mars</td>\n
<td bgcolor='#C1CDC1'>$avril</td>\n
<td bgcolor='#ADD8E6'>$mai</td>\n
<td bgcolor='#C1CDC1'>$juin</td>\n
<td bgcolor='#ADD8E6'>$juil</td>\n
<td bgcolor='#C1CDC1'>$aout</td>\n
<td bgcolor='#ADD8E6'>$sept</td>\n
<td bgcolor='#C1CDC1'>$oct</td>\n
<td bgcolor='#ADD8E6'>$nov</td>\n
<td bgcolor='#C1CDC1'>$dec</td>\n
<td bgcolor='#FFFF66'>$total_par_annee</td>\n <!--ligne horizontale-->
<td bgcolor='#FFCCCC'>$mois_max $max_par_annee</td>\n
<td bgcolor='#F5F5DC'>$annee</td>\n <!--ajout-->
<tr bgcolor='##FF00FF'></tr>\n";//fin de tableau

}//fin du while
echo "<tr>\n
<tr>
<th BGCOLOR='#F5F5DC'>$number<br>Années</th>
<th BGCOLOR='#ADD8E6'>janv</th>
<th BGCOLOR='#C1CDC1'>fév</th>
<th BGCOLOR='#ADD8E6'>mars</th>
<th BGCOLOR='#C1CDC1'>avr</th>
<th BGCOLOR='#ADD8E6'>mai</th>
<th BGCOLOR='#C1CDC1'>juin</th>
<th BGCOLOR='#ADD8E6'>juil</th>
<th BGCOLOR='#C1CDC1'>août</th>
<th BGCOLOR='#ADD8E6'>sept</th>
<th BGCOLOR='#C1CDC1'>oct</th>
<th BGCOLOR='#ADD8E6'>nov</th>
<th BGCOLOR='#C1CDC1'>déc</th>
<th BGCOLOR='#FFFF66'>Total</th>
<th BGCOLOR='#FFCCCC'>Maxi</th>
<th BGCOLOR='#F5F5DC'>$number<br>Années</th> <!--ajout-->

<th BGCOLOR='#FFFFCC'>Graph</th>

</tr>
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
7 déc. 2019 à 00:39
Bon.... il y a plusieurs soucis avec ta réponse....

1 - Merci d'utiliser CORRECTEMENT les balises de code ( en y indiquant le langage afin d'avoir la coloration syntaxique et l'indentation )
Je te redonne le lien du tuto : https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

2 - Tu utilises l'ancienne extension mysql .... qui est OBSOLETE.
Il faut désormais utiliser PDO ou MYSQLI
https://www.commentcamarche.net/faq/43261-php-l-extension-mysql-est-obsolete#top

3 - ( le plus important !!! ) je t'ai demandé le code de ta BDD ( structure + données ) ... pas ton code php !

4 - Comme je le craignais... tu as mal conçu ta bdd ....
Avoir une colonne par mois est une grosse erreur ( erreur de débutant qui penses qu'une BDD fonctionne comme un fichier excel... )
Ta table devrait être de la forme : annee | mois | valeur
et avoir une ligne par couple année/mois
De cette façon il serait possible d'utiliser la fonction MAX de SQL, également les fonctions SUM , GROUP BY... bref... tout ce qui permettrait d'obtenir les données voulues facilement....


0
merci pour la réponse
le programme date de plusieurs années je ne l'ai pas conçu de A à Z je l'ai adapté à mes besoins donc le refaire entièrement n'est pas mon objectif j'utilise le serveur sql de free voici un dump de la BDD
S'il n'est pas possible d'avoir le maxi sur l'ensemble des années, pas de soucis c'était juste un petit plus à afficher!

phpMyAdmin SQL Dump
-- version 3.1.5
-- http://www.phpmyadmin.net
0
-- phpMyAdmin SQL Dump
-- version 3.1.5
-- http://www.phpmyadmin.net
--
-- Serveur: sql.free.fr
-- Généré le : Dim 01 Décembre 2019 à 10:19
-- Version du serveur: 5.0.83
-- Version de PHP: 5.3.9

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Base de données: `ma_BDD`
--

-- --------------------------------------------------------

--
-- Structure de la table `la_pluviometrie`
--

CREATE TABLE IF NOT EXISTS `la_pluviometrie` (
  `index` varchar(20) collate latin1_general_ci NOT NULL,
  `annee` year(4) NOT NULL,
  `janv` decimal(4,1) NOT NULL,
  `fev` decimal(4,1) NOT NULL,
  `mars` decimal(4,1) NOT NULL,
  `avril` decimal(4,1) NOT NULL,
  `mai` decimal(4,1) NOT NULL,
  `juin` decimal(4,1) NOT NULL,
  `juil` decimal(4,1) NOT NULL,
  `aout` decimal(4,1) NOT NULL,
  `sept` decimal(4,1) NOT NULL,
  `oct` decimal(4,1) NOT NULL,
  `nov` decimal(4,1) NOT NULL,
  `dec` decimal(4,1) NOT NULL,
  `total` decimal(10,1) NOT NULL,
  KEY `index` (`index`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

--
-- Contenu de la table `la_pluviometrie`
--

INSERT INTO `la_pluviometrie` (`index`, `annee`, `janv`, `fev`, `mars`, `avril`, `mai`, `juin`, `juil`, `aout`, `sept`, `oct`, `nov`, `dec`, `total`) VALUES
('', 1988, 132.0, 105.0, 83.0, 70.0, 76.0, 11.0, 65.0, 9.0, 29.0, 47.0, 37.0, 43.0, 707.0),

//tronqué//

('', 2019, 38.4, 33.3, 52.5, 35.7, 40.5, 64.8, 17.4, 72.9, 40.4, 124.5, 140.7, 0.0, 520.9);

0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
Modifié le 9 déc. 2019 à 12:55
En mysql il existe la fonctio GREATEST pour trouver la valeur la plus grande sur un ensemble de colonnes
https://dev.mysql.com/doc/refman/5.6/en/comparison-operators.html#function_greatest

Un truc du genre
SELECT `index`,
  annee,
 GREATEST(
    IFNULL(janv,0),
    IFNULL(fev,0),
    IFNULL(mars,0),
    IFNULL(avril,0),
    IFNULL(mai,0),
    IFNULL(juin,0),
    IFNULL(juil,0),
    IFNULL(aout,0)
    IFNULL(sept,0)
    IFNULL(oct,0)
    IFNULL(nov,0)
    IFNULL(dev,0)
) plusgrand
FROM la_pluviometrie


0
j'ai ajouté les lignes mais ça n'affiche pas la valeur max???
voici la modif
$query = "SELECT * FROM la_pluviometrie ORDER by annee  ";//org

//modif du 9 dec 2019
$querymax = "SELECT `index`,
annee,
GREATEST(
IFNULL(janv,0),
IFNULL(fev,0),
IFNULL(mars,0),
IFNULL(avril,0),
IFNULL(mai,0),
IFNULL(juin,0),
IFNULL(juil,0),
IFNULL(aout,0)
IFNULL(sept,0)
IFNULL(oct,0)
IFNULL(nov,0)
IFNULL(dev,0)
) plusgrand
FROM la_pluviometrie ";
//fin de modif
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > pc249
9 déc. 2019 à 22:05
Alors... tu as créé une variable $querymax ..... l'exécutes tu au moins ?
Au passage Je te redonne le lien du tuto concernant les balises de code que tu as du mal à utiliser visiblement : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code


Je t'invite également à lire ET à appliquer le contenu de ce lien :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

Et pour finir.... afin de voir si une requête fonctionne et avoir un aperçu de ce qu'elle retourne il faut d'abord la tester DIRECTEMENT dans la BDD ( via phpmyadmin par exemple )
Et seulement après on peut l'utiliser dans un code PHP ...
0
les balise visiblement ne fonctionnent pas poutant je met entre les cotes ???

voici le résultat quand je lance directement dans mysql
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IFNULL(sept,0), IFNULL(oct,0), IFNULL(nov,0), IFNULL(dev,0), ) plusg' at line 10
SELECT `index` , annee, GREATEST( IFNULL( janv, 0 ) , IFNULL( fev, 0 ) , IFNULL( mars, 0 ) , IFNULL( avril, 0 ) , IFNULL( mai, 0 ) , IFNULL( juin, 0 ) , IFNULL( juil, 0 ) , IFNULL( aout, 0 ) IFNULL( sept, 0 ) , IFNULL( oct, 0 ) , IFNULL( nov, 0 ) , IFNULL( dev, 0 ) , ) plusgrand
FROM `la_pluviometrie`
LIMIT 0 , 30
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > pc249
9 déc. 2019 à 23:03

les balise visiblement ne fonctionnent pas poutant je met entre les cotes

Tu as bien lu le tuto ?? .... il faut spécifier le LANGAGE dans les balises de code.

Voici la requête corrigée
SELECT `index`,
  annee,
 GREATEST(
    IFNULL(janv,0),
    IFNULL(fev,0),
    IFNULL(mars,0),
    IFNULL(avril,0),
    IFNULL(mai,0),
    IFNULL(juin,0),
    IFNULL(juil,0),
    IFNULL(aout,0),
    IFNULL(sept,0),
    IFNULL(oct,0),
    IFNULL(nov,0),
    IFNULL(`dec`,0)
) plusgrand
FROM la_pluviometrie
0
merci la requête fonctionne bien en direct sur le serveur mais le but c'est d'afficher une seule année ou la valeur est la plus haute (cumul de tous les mois) pour l'instant de 1988 à 2019 c'est l'annéee 1994 avec 863 mm qui arrive en tête donc je voudrais afficher "l'année de tous les records de pluviométrie est 1994 avec 863 mm"
j'ai remplacé index par annee et annee par total
0
merci pour la réponse pour les balises tjrs le me^me pb????
le code ci-dessous fonctionne sur le server mais pour la partie php non...
au niveau des query je ne sais pas trop! j'ai mis un query à la suite de celui d'origine c'est pas top je pense

<?php
SELECT annee, total
FROM `la_pluviometrie`
ORDER BY `index` DESC
LIMIT 1
$query = "SELECT * FROM la_pluviometrie ORDER by annee  "; //affiche tout le tableau indispensable
$querymax ="SELECT annee, total
FROM `la_pluviometrie`
ORDER BY `index` DESC
LIMIT 1";

$resultmax = @mysql_query($querymax) or die('Erreur SQL !<br />'.$resultmax.'<br />'.mysql_error()); //arret sur erreur
$numbermax = @mysql($resultmax);
echo "$numbermax" ;
?>
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
10 déc. 2019 à 09:59
Ligne 12 ok
Ligne 13 .... $resultmax ? ... non c'est $query

Ligne 14 : Si tu ne fais pas un fetch ... tu ne verras jamais rien...
0

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

Posez votre question
là j'ai besoin du spécialiste pour sortir la valeur! car ça affiche Array mais il y a sans doute une bonne raison... une bonne nouvelle les balises fonctionnent!
<?php
//modif du 9 dec 2019
$query2 = "SELECT annee, total FROM la_pluviometrie ORDER by total DESC LIMIT 1 ";
$result2 = @mysql_query($query2) or die('Erreur SQL !<br />'.$result2.'<br />'.mysql_error()); //arret sur erreur

while($row1 = @mysql_fetch_row($result2)){
$max_des_annee = max(array($row1));	

	
}
echo $max_des_annee ;
//fin de modif*/
?>
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
10 déc. 2019 à 20:13
C'est un array associatif
Il faut donc utiliser la syntaxe
while($row1 = @mysql_fetch_row($result2)){
   $annee= $row1['annee'];
  $total = $row1['total'];
  echo $annee . " : " . $total ;
}
0
merci pour la réponse mais ça affiche seulement les 2 points !
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
10 déc. 2019 à 21:01
Je n'avais pas vu qu'elle fetch tu avais utilisé
Donc
echo $row[0]; 
echo $row[1];


0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
10 déc. 2019 à 21:02
Et si tu veux utiliser la syntaxe que je t'ai donné dans ce cas utilise celui-là
https://www.php.net/manual/fr/function.mysql-fetch-array.php
0
çà été laborieux mais ça fonctionne!
ça parait simple quand on a la solution mais quand on maitrise mal sql et php c'est galère...
un grand merci pour ton aide et surtout ta patience.
cdt
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > pc249
10 déc. 2019 à 21:31
0