[mysql] Somme des dernières entrées

Bonjour,

J’explique mon soucis, en fait chaque matin, un formulaire est rempli, la date se fait automatiquement via du php et il y a aussi une colonne qui s’incrémente de 1 à chaque entrée.
Et donc je voudrais que les 7 dernières entrées de la colonne ‘total’ soient additionné pour en faire un total sur les 7 derniers jours.

Voici la table :

et le bout de code :

il y a obligatoirement une entrée par jour donc pas de soucis de ce côté là et j’aimerais utiliser la colonne id pour récuperer les 7 dernières entrées si possible

Merci

SELECT SUM(total) as masomme FROM district1 ORDER BY id DESC LIMIT 7

si j’ai bien compris :slight_smile:

Je l’avais déjà essayé mais cela me donne le total de la colonne et non pas des 7 derniers.
Mais je pensais que LIMIT ne servait que pour afficher le résultat !

Tu ne peux pas plutôt additioner les valeurs avec un code PHP ?

Genre :


<?PHP

$db = mysql_connect('localhost', 'xxxxxxxxx', 'xxxxxxxxx');
mysql_select_db('xxxxxxxxxx',$db);

$sql = 'SELECT total,id FROM district1 ORDER BY id DESC LIMIT 7;
$result = mysql_query($sql) or die ('Erreur : '.mysql_error() );
$total = 0;

while ($res = mysql_fetch_array($result))
   $total += $res['total'];
echo "Le total est de : " . $total . "<br> Sur les 7 derniers jours<br>";
mysql_close();
?>


Sinon, tu peux t’en sortir avec une sous-requête :

SQL
[color=blue;font-weight:bold]SELECT[/color] SUM(total) as masomme FROM (SELECT total,id FROM district1 ORDER BY id DESC LIMIT 7)

Mais ça ne sera pas compatible si la version de MySQL est trop vieille (je pense qu’il faut au moins MySQL 4.1)

Et bien merci :super:

cela à bien fonctionné avec le code php

je n’ai pas testé la sous-requête car je pense que ma version de mysql est plein de ride, 3.23.39 :paf:

Cela me règle le problem pour les 7 derniers jours, mais pour la fin du mois, sachant qu’il y a parfois 30 où 31 jours, quel serait la meilleur solution ?

tu devrais utiliser le type DATE pour le champ date, cela te permettrait d’utiliser les fonctions de date sur ce champ, et donc de faire un filtrage sur le mois du genre :
SELECT SUM(total) as masomme FROM district1 WHERE MONTH(date) = 2;
(exemple pour février … si tu veux le mois précédent et que tu ne peux pas le spécifier dans la requète, voir pour forger une date avec mktime())

> http://dev.mysql.com/doc/refman/5.0/fr/dat…-functions.html

Edit : et pareil pour le total, tu devrais le mettre en entier non-signé, et le dimensionner en fonction de l’estimation maximale qu’il doit pouvoir atteindre … tu sais, il existe d’autres types de données que varchar en SQL :wink:

> http://dev.mysql.com/doc/refman/5.0/fr/column-types.html

J’aimerais bien utiliser le champ date, mais voici le formulaire de départ

<input name="date" type="text" value ="<?php
       $date = date("d-m-Y");
       echo "$date";
       ?>" size="10" maxlength="10" />

Sachant que l’utilisateur doit pouvoir modifier la date, au cas où, et ne surtout pas le perturber en mettant bien “jour-mois-année”.

Ce serait possible de mettre un champ date dans ce cas là, si possible comment le faire et calculer la somme mensuel par la suite ?

Merci

bien sur … depuis MySQL 4.1.1, il y’a la fonction STR_TO_DATE qui effectue cette conversion :oui:

dans ton cas, ça donnerait ça, lors de l’insertion des données dans la table :


INSERT INTO district1 ....... date=STR_TO_DATE('$date', '%d-%m-%Y') ........

STR_TO_DATE te translate la date au format MySQL (par défaut YYYY-MM-DD)

donc les étapes :

  • changer le type de ton champ en DATE
  • convertir les eventuelles date déjà saisie
  • mettre à jour ta requète d’insertion
  • créer ta requète de trie sur mois

Vu que pour l’instant je ne peux upgrader la version de mysql, j’ai ajouté des tables :

CREATE TABLE district1 (
  id int(255) NOT NULL auto_increment,
  jour varchar(255) NOT NULL default '',
  mois varchar(255) NOT NULL default '',
  annee varchar(255) NOT NULL default '',
  xxxx1 varchar(255) NOT NULL default '',
  xxxx2 varchar(255) NOT NULL default '',
  xxxx3 varchar(255) NOT NULL default '',
  xxxx4 varchar(255) NOT NULL default '',
  xxxx5 varchar(255) NOT NULL default '',
  xxxx6 varchar(255) NOT NULL default '',
  total varchar(255) NOT NULL default '',
  PRIMARY KEY  (id)
) TYPE=MyISAM;

Je pense qu’avec le champ ‘mois’ qui est rempli avec soit ‘01’ ‘02’… je peux afficher le total par mois. Voici le formulaire pour info :

Jour
                      <input name="jour" type="text" value ="<?php
       $jour = date("d");
       echo "$jour";
       ?>" size="2" maxlength="2" />
                      Mois
                      <input name="mois" type="text" value ="<?php
       $mois = date("m");
       echo "$mois";
       ?>" size="2" maxlength="2" />
                      Ann&eacute;e
                      <input name="annee" type="text" value ="<?php
       $annee = date("Y");
       echo "$annee";
       ?>" size="4" maxlength="4" />

Voici l’ancien code qui me permettais d’afficher les 30 derniers jours, mais, comment additionner seulement ceux d’une meme valeur dans la colonne ‘mois’ ?

<?PHP

$db = mysql_connect('localhost', 'xxxxxx', 'xxxxxx');
mysql_select_db('xxxxxx',$db);

$sql = 'SELECT total,id FROM district1 ORDER BY id DESC LIMIT 30';
$result = mysql_query($sql) or die ('Erreur : '.mysql_error() );
$total = 0;

while ($res = mysql_fetch_array($result))
  $total += $res['total'];
echo "<font size='2' color='#ff0000' face='Verdana, Arial, Helvetica, sans-serif'>Le total est de : " . $total . "<br> Sur les 30 derniers jours</font><br>";
mysql_close();
?>

Merci encore