Ik zit al een behoorlijk tijd te hammeren op het volgende en wens me bij dezen toch te beroepen op jullie kennis!

Ik ben bezig met een ranking systeem voor een dartclub. Tijdens zo'n dartavond haalt een darter een x aantal punten (behp), heeft ie een x aantal legs voor (legsv) en zo ook een x aantal legs tegen (legst).
Deze gegevens worden elke keer in de database gezet. Zo ook wens ik een correct output.
Dit gaat ook goed, echter de output van het aantal behaalde punten (punten) op die avond gaat niet goed. De output is het aantal behp van de eerst ingevoerde speelavond en niet de laatste ingevoerde speelavond behorende bij die darter.
Let wel, de SUM van behp (totaal) gaat dus wel gewoon goed.

Hoe krijg ik de laatste punten naar voren van deze darter?

<?
$query =
"
SELECT
t1.naam AS naam,
t2.behp AS punten,
SUM(t2.behp) AS totaal,
SUM(t2.legsv) AS lvoor,
SUM(t2.legst) AS ltegen
FROM
darters AS t1,
rankingbehaald AS t2
WHERE
t2.nid = t1.dartid
GROUP BY
naam
ORDER BY
totaal DESC, naam ASC
";

$result = mysql_query($query) or die (mysql_error());
?>

<?php
$i = 0;
while (list($naam, $punten, $totaal, $lvoor, $ltegen, $datum) =
mysql_fetch_row($result)){
{
$i++;
$saldo = $lvoor - $ltegen;
}
echo("
<td></td>
<td width=40> $i</td>
<td width=190> $naam </a></td>
<td width=100> $punten </td>
<td width=100><b> $totaal </b></td>
<td width=100> $lvoor</td>
<td width=80> $ltegen </td>
<td width=40 align=right><b> $saldo <b></td>
<td width=40> &nbsp; </td>
</tr>
");
}
?>

Ziet iemand het licht op mijn vraag?
Ik moet nog even meegeven dat er (uiteraard) tijdens de invoer van de ranking ook een datum toegevoegd wordt.
Dat klopt inderdaad, dat komt namelijk omdat je een GROUP BY gebruikt. Zodra de resultaten gegroepeert zijn is het niet meer mogelijk om individuele records uit een groep te gebruiken.

Sterker nog, in deze query weet je nooit zeker welk resultaat MySQL teruggeeft als 'punten'. Vaak zal het eerste record uit een groep getoond worden en blijkbaar komt dat in dit geval overeen met de eerste avond.

Kortom, wil je een aantal punten van 1 avond weten, dan zul je daar een aparte query voor moeten gebruiken.
Naar aanleiding van je reactie heb ik het één en ander geprobeerd.
Hierbij denkend aan UNION en een gewone query.

Toch slaag ik er (momenteel) niet in om een query te creeëren die de laatst behaalde punten uitleest per persoon. (Middels een while list.)
Zou je misschien een voorbeeld query kunnen plaatsen, een link naar een tutorial of een concrete tip?

Tabel darter:
dartid
dartnaam

Tabel avond:
avondid
datum

Tabel ranking:
rankid
behp
nid (--> dartid)
sid (--> avondid)

Vb:
Op 10-07-2007 heeft piet 12 punten behaald.
Op 10-07-2007 heeft jan 4 punten behaald.
Op 12-07-2007 heeft piet 6 punten behaald.
Op 12-07-2007 heeft jan 9 punten behaald.

Output op 13-07-2007:
Naam - punten - totaal
Piet - 6 - 18
Jan - 9 - 13
Dat is dus precies wat ik zeg, je kunt niet in 1 query zowel het totaal als een individueel aantal ophalen. Het ene is namelijk een eigenschap van een groep en zodra je groepeert heb je geen beschikking meer over de individuele records.

Je zult in dit geval dus echt 2 queries moeten gebruiken.
Je hebt gelijk. In mijn laatst genoemde voorbeeld komt het op hetzelfde neer.
Dat totaal kan in het voorbeeld even achterwege blijven.

Het gaat nu even om de query die de laatst behaalde punten uitleest per persoon.

Output op 13-07-2007:
Naam - Punten
Piet - 6
Jan - 9
Het werken met LIMIT werkt in dit verhaal niet en zo ook lukte het niet met surdate.

Ik zal eens kijken wat ik kan doen om de laatste ingevoerde speelavond te gebruiken voor de output.

In ieder geval bedankt voor je reacties.

Reageren