Getallen uit een database halen en optellen.
Ik weet niet hoe ik dit doe, misschien is het heel simpel maar ik kan het niet vinden.
Wat heb ik
Ik wil een gemiddelde berekenen van een aantal cijfers, daar heb ik eerste de AVG() optie voor gebruikt. Dat werkte prima maar elk cijfer heeft een zogenaamd 'gewicht'.
Voorbeeldje:
Cijfer: 5 | | | Gewicht: 3
Cijfer: 9 | | | Gewicht: 2
Cijfer: 3 | | | Gewicht: 4
Mijn database ziet er zo uit:
[ id ] [ kolom ] [ cijfer ] [ gewicht ]
Ik heb nu deze query gebruikt:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?
$csql = "SELECT *, (cijfer * gewicht) AS gem FROM cijfers WHERE kolom = '" .$obj->kolom. "' AND id = '" .$_SESSION["id"] . "' GROUP BY id";
$cresult = mysql_query($csql) or die(mysql_error());
while ($cobj = mysql_fetch_object($cresult))
{
echo "<td bgcolor=\"red\">".$cobj->gem . "</td>";
}
?>
$csql = "SELECT *, (cijfer * gewicht) AS gem FROM cijfers WHERE kolom = '" .$obj->kolom. "' AND id = '" .$_SESSION["id"] . "' GROUP BY id";
$cresult = mysql_query($csql) or die(mysql_error());
while ($cobj = mysql_fetch_object($cresult))
{
echo "<td bgcolor=\"red\">".$cobj->gem . "</td>";
}
?>
Maar nu moet dus het gewicht uit de kolom komen waar (WHERE vak = '" .$obj->vak. "' AND id = '" .$_SESSION["id"]). Misschien een wat vaag verhaal maar ik hoop dat iemand het snapt. Nog even een ander voorbeeld:
ID: 1
Kolom: 2
Cijfer: 4
Gewicht: 2
ID: 1
Kolom: 2
Cijfer: 6
Gewicht: 3
ID: 2
Kolom: 2
Cijfer: 4
Gewicht: 2
Dan wil ik van de eerste 2 het gewicht optellen (2 + 3), maar van de laatste niet omdat daar id 2 is.
Gewijzigd op 04/02/2006 11:14:00 door Mark
Zoek is bij mysql Naar SUM
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?
$id = $_SESSION['id'];
$csql = "SELECT *, (cijfer * gewicht) AS gem FROM cijfers WHERE kolom = '" .$obj->kolom. "' AND id = $id GROUP BY id";
$cresult = mysql_query($csql) or die(mysql_error());
while ($cobj = mysql_fetch_object($cresult))
{
echo "<td bgcolor=\"red\">".$cobj->gem . "</td>";
}
?>
$id = $_SESSION['id'];
$csql = "SELECT *, (cijfer * gewicht) AS gem FROM cijfers WHERE kolom = '" .$obj->kolom. "' AND id = $id GROUP BY id";
$cresult = mysql_query($csql) or die(mysql_error());
while ($cobj = mysql_fetch_object($cresult))
{
echo "<td bgcolor=\"red\">".$cobj->gem . "</td>";
}
?>
@han, ik ga op zoek
Een aantal, dus niet alle? Dan heb je of een tweede query nodig, of je doet het in de while loop waar je je records fetcht.
QUERY: SELECT *, ((cijfer * gewicht) / SUM(gewicht)) AS gem
alleen dat klopt dan natuurlijk niet ;) dus ik moet er denk ik een tweede query in stoppen.
Update: Ok, ik heb het nu zo:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
$gsql = "SELECT *, SUM(gewicht) AS gewichttot FROM cijfers WHERE vak = '" .$obj->vak. "' AND id = '" .$_SESSION["id"] . "' GROUP BY id";
$gresult = mysql_query($gsql) or die(mysql_error());
while ($gobj = mysql_fetch_object($gresult)) {
$gewichttot = $gobj->gewichttot;
$csql = "SELECT *, ((cijfer * gewicht) / ".$gewichttot.") AS gem FROM cijfers WHERE vak = '" .$obj->vak. "' AND id = '" .$_SESSION["id"] . "' GROUP BY id";
$cresult = mysql_query($csql) or die(mysql_error());
while ($cobj = mysql_fetch_object($cresult)) {
echo "<td bgcolor=\"red\">".$cobj->gem . "</td>";
}
}
?>
$gsql = "SELECT *, SUM(gewicht) AS gewichttot FROM cijfers WHERE vak = '" .$obj->vak. "' AND id = '" .$_SESSION["id"] . "' GROUP BY id";
$gresult = mysql_query($gsql) or die(mysql_error());
while ($gobj = mysql_fetch_object($gresult)) {
$gewichttot = $gobj->gewichttot;
$csql = "SELECT *, ((cijfer * gewicht) / ".$gewichttot.") AS gem FROM cijfers WHERE vak = '" .$obj->vak. "' AND id = '" .$_SESSION["id"] . "' GROUP BY id";
$cresult = mysql_query($csql) or die(mysql_error());
while ($cobj = mysql_fetch_object($cresult)) {
echo "<td bgcolor=\"red\">".$cobj->gem . "</td>";
}
}
?>
Een tweede query erin, hij vind nu gemiddeld totaal wel waar hij het door moet delen. Maar ik krijg wanneer er meer cijfers moeten worden opgeteld worden een verkeerd antwoord, ik denk dat er ergens iets neit helemaal klopt :P
Als ik dit heb:
36 = 2 x
63 = 3 x
72 = 4 x
36x2 + 63x3 + 72x4 / 9 = 61
Ik krijg er 8 uit.... (via de query). Of moet ik eerst de query helemaal uit laten voeren en dan pas delen door gewichttotaal ?
Update 2: Ik heb het probleem gevonden, wanneer ik cijfer x gewicht doe, pakt hij alleen de eerste en dat is 36x2 = 72 en 72 / 9 = 8
Update 3: Ok, ik heb GROUP BY id weggehaald uit de query en ik krijg nu netjes alle antwoorden uit
36 x 2 = 72
63 x 3 = 189
72 x 4 = 288
;) die moeten dus allemaal opgeteld worden.................of kan ik hier net zo goed een extra kolom in de tabel plaatsen die dat meteen uitrekend als het ingevoerd wordt?
Gewijzigd op 04/02/2006 13:09:00 door Mark
(36 x 2 + 63 x 3 + 72 x 4) / (2 + 3 + 4)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
$gsql = "SELECT *, SUM(gewichttot) AS cijfer FROM cijfers WHERE kolom = '" .$obj->kolom. "' AND id = '" .$_SESSION["id"] . "' GROUP BY kolom";
$gresult = mysql_query($gsql) or die(mysql_error());
while ($gobj = mysql_fetch_object($gresult)) {
$cijfer = $gobj->cijfer;
$csql = "SELECT *,SUM(gewicht) AS gewicht FROM cijfers WHERE kolom = '" .$obj->kolom. "' AND id = '" .$_SESSION["id"] . "' GROUP BY kolom";
$cresult = mysql_query($csql) or die(mysql_error());
while ($cobj = mysql_fetch_object($cresult)) {
echo "<td bgcolor=\"red\" width=\"200\">".$cijfer / $cobj->gewicht ."</td>";
}
}
?>
$gsql = "SELECT *, SUM(gewichttot) AS cijfer FROM cijfers WHERE kolom = '" .$obj->kolom. "' AND id = '" .$_SESSION["id"] . "' GROUP BY kolom";
$gresult = mysql_query($gsql) or die(mysql_error());
while ($gobj = mysql_fetch_object($gresult)) {
$cijfer = $gobj->cijfer;
$csql = "SELECT *,SUM(gewicht) AS gewicht FROM cijfers WHERE kolom = '" .$obj->kolom. "' AND id = '" .$_SESSION["id"] . "' GROUP BY kolom";
$cresult = mysql_query($csql) or die(mysql_error());
while ($cobj = mysql_fetch_object($cresult)) {
echo "<td bgcolor=\"red\" width=\"200\">".$cijfer / $cobj->gewicht ."</td>";
}
}
?>
Thanks allemaal
Gewijzigd op 04/02/2006 13:24:00 door Mark