2010-01-27 12 views
2

J'ai un problème mineur avec une page d'administration de base de données que j'utilise pour mettre à jour des valeurs et des totaux dans une base de données MySQL pour générer diverses figures et données pour un site web. Un peu d'arrière-plan - la table de base de données en question contient les totaux de collecte de fonds pour un libraire de charité, avec la table ayant trois colonnes - id, date et amountraised. Il n'est pas difficile de faire la somme du total recueilli pour une année donnée ou pour l'année en cours - j'ai déjà un total cumulatif de février dernier lorsque la collecte de fonds a commencé et un pour l'année en cours, et ça fonctionne bien. Je viens de me rendre compte tout en ajoutant au total de cette semaine que je sais que le total des fonds recueillis et le montant qui a été recueilli jusqu'ici cette année ne sont nulle part le total de l'année dernière. Évidemment pour cette année, je peux juste prendre le total à ce jour pour cette année du grand total, mais j'ai vraiment besoin d'un total pour chaque année à montrer. J'ai un tableau affiché sur la page qui montre les objectifs de collecte de fonds pour chaque année, et je veux ajouter le total de l'année à ce tableau afin que nous puissions voir à la fois la cible pour chaque année et le montant recueilli an.Somme des valeurs par année avec MySQL/PHP

Dans le bit de la page qui affiche le total en cours d'exécution, je donne les résultats suivants, qui affichent le grand total, et le total pour l'année en cours:

$result = mysql_fetch_array($query);
$sumtotal = $result["sum_total"];

$query2 = mysql_query("SELECT SUM(amountraised) AS year_total FROM fundraisingtotal WHERE YEAR(date) = AN (CURDATE()); »);
$ result2 = mysql_fetch_array (query2 $);
$ yeartotal = $ result2 [ "year_total"];
>
<p class="dbpara">The current fundraising total since February 2009 is <b>&pound;<? echo "$sumtotal"; ?></b>.</p>
<p class="dbpara">The current fundraising total for this year (<?php echo date('Y'); ?>) is <b>&pound;<? echo "$yeartotal"; ?></b>.</p>

également sur la même page j'ai l'affichage du f? Le fait que la collecte de fonds totalise les données dans un tableau distinct des objectifs annuels (les objectifs annuels sont dans un tableau avec juste l'année et la cible), et en partie parce que le tableau qui affiche la cible annuelle utilise une boucle while pour écrire les données de la base de données vers la page. Voici le code que je utilise pour écrire la table et les données (je l'ai mis la cellule de table pour le total des fonds levés, mais de toute évidence pas de code pour cela):

<?php $query="SELECT * FROM annualtarget ORDER BY year DESC"; $result=mysql_query($query);
$num = mysql_num_rows ($result);
if ($num > 0) {
$i=0;
while ($i < $num) {
$year = mysql_result($result,$i,"year");
$target = mysql_result($result,$i,"target");
$id = mysql_result($result,$i,"id");
echo "<tr><td class=\"yr\"> $year </td><td class=\"tg\"> &pound;$target </td><td class=\"total\"> ???? </td><td class=\"update\"><a href=\"updatetarget.php?id=$id\">Update</a></td><td class=\"delete\"><a href=\"delete.php?id=$id\">Delete</a></td></tr>";
++$i; } } else { echo "<tr><td colspan=\"4\">The database is empty!</td></tr>"; }
mysql_close();
?>

Il est évident que Je vais avoir besoin d'une requête différente pour calculer les totaux pour l'année, mais je ne peux pas déterminer comment je peux travailler dans la boucle while. Je pourrais utiliser la date du tableau des montants de collecte de fonds en séparant le peu d'année de la date, mais étant donné que la cible pour chaque année est dans un tableau différent qui ne fonctionnerait pas, et je ne veux vraiment pas avoir à ... code l'année et son total soulevé dans la base de données juste pour afficher, quand je peux (si je peux comprendre comment le faire) utiliser la base de données pour le calculer.

Je manque probablement quelque chose de ridiculement évident ici, mais je ne peux pas le comprendre. Quelqu'un at-il une idée de comment je peux faire cela?

+0

Merci pour le heads up. Trié. ;-) – BlissC

Répondre

1
SELECT a.year , SUM(f.amountraised) , a.target 
FROM annualtarget a INNER JOIN fundraisingtotal f ON (a.year = YEAR(f.date)) 
GROUP BY a.year 
+0

Argggh! J'avais oublié les jointures (je n'ai jamais compris) - Je pense que c'est dans le sens de ce dont j'ai besoin. J'ai essayé de l'exécuter dans PHPMyAdmin, et il donne un total pour 2009, et la cible sur la même ligne, mais le total est loin (environ £ 2000 moins que je sais a été soulevé), et quand j'ai essayé de l'utiliser la page web, je ne pouvais pas comprendre ce que j'avais besoin d'utiliser dans la boucle while, ie '$ year_total = mysql_result ($ result, $ i," ??? ");' alors bien sûr, les erreurs MySQL s'affichent - ' Attention: mysql_result() [function.mysql-result]: année_total introuvable dans MySQL index 7 in' ... etc – BlissC

+0

@NeonBlue Blis si vous voulez chercher la variable year_total vous devez renommer la variable avec le mot-clé AS comme je l'ai fait dans ma réponse. – SorcyCat

+0

Merci à vous deux - tout fonctionne bien maintenant! :-) Ceci est ma requête terminée: 'SELECT a.year, SUM (f.amountraised) AS année_total, a.target DE annualtarget une INNER JOIN fundraisingtotal f ON (a.year = YEAR (f.date)) GROUP BY a.year ORDER BY année DESC' – BlissC

2

Utilisez une requête "group by" pour obtenir tous vos totaux à la fois.

SELECT YEAR(date) as year, SUM(amountraised) AS year_total 
FROM fundraisingtotal 
GROUP BY YEAR(date) 
+0

Merci. Cela me donne les totaux pour l'année, mais pour l'année en cours seulement (que j'ai déjà ailleurs sur la page avec une requête légèrement différente (query2 dans mon post original) .Si je sors le 'WHERE YEAR (date) = YEAR (CURDATE()) 'qui me donne le total pour chaque année (et une ligne vide dans le tableau HTML avec une année répertoriée comme 0 pour une raison quelconque), mais supprime les cibles de la 2ème colonne du tableau HTML. – BlissC

+0

D'oh! Je devrais être plus prudent lorsque vous copiez du code. Corrigé cela dans la réponse. La réponse de @ dev-null-dweller a semblé grande, btw. – SorcyCat

Questions connexes