Voor het klassement van mijn mahjongclubje heb ik een algemeen klassement bedacht waarbij de beste 20 resultaten van iedere speler tellen.
In het bestand functions.php is dat als volgt gedefinieerd:
function standmetscoresmetid($id) {
// Get database connection
$db = JFactory::getDbo();
$qry = "SELECT SpelerID, SpelerNaam, Average, Aantal, Hoogste, Laagste "
. "FROM vwStand "
. "WHERE SeizoenID = " . $db->quote($id). " AND AANTAL<>0 ORDER BY Average DESC;";
$tbl = new HTML_Table(null, 'display', 1, 0, 4, array('width'=>'100%'));
}
Maar deze methode bevalt me niet meer zo goed. Ik zou ook de "slechtste" resultaten willen laten
meetellen. Bijvoorbeeld de beste 10 en de slechtste 10, en daar dan het gemiddelde van.
Maar ik heb geen idee hoe ik de 'slechtste 10' moet definiëren.
Iemand een hint?? Alvast bedankt!
Haal het stukje AND AANTAL <>0 eens weg...
Maar ik neem aan dat je de resultaten (of zelfs het aantal resultaten) niet bijhoudt in de rij bij de gebruiker... maar die gewoon elke keer opnieuw berekent/bekijkt in de tabel met resultaten...
Maar ik neem aan dat je de resultaten (of zelfs het aantal resultaten) niet bijhoudt in de rij bij de gebruiker... maar die gewoon elke keer opnieuw berekent/bekijkt in de tabel met resultaten...
Ja, dat klopt. (Het nadeel is ook dat het openen van de html-pagina waarop het klassement staat, langt duurt
omdat alle resultaten opnieuw geëvalueerd moeten worden.)
Daar had ik op gehoopt, Maarten, maar tot nu toe kom ik er niet uit. Maar de hint is duidelijk: ik geef het nog niet op! Misschien meer geduld nodig… ;-)
Het handigste lijkt mij als je een extra kolom 'average_score' toevoegt. En dan heb je enkel eenmalig een goede functie / formule nodig die de hoogte van de 'gemiddelde score' berekent. De uitkomst schrijf je weg in dit veld en vervolgens hoef je alleen maar
SELECT SpelerID, SpelerNaam, Average, Aantal, Hoogste, Laagste
FROM vwStand
WHERE SeizoenID = 5
ORDER BY average_score DESC
LIMIT 20
Dit komt in de goede richting, Frank! Maar op deze manier krijg je toch niet het gemiddelde van de beste 20 en de slechtste 20 partijen (van een speler
die bijvoorbeeld al 100 partijen heeft gespeeld (van wie in het door mij bedoelde model dus 60 partijen niet worden meegenomen in het gemiddelde).
SELECT ((high.hoogste + low.laagste) / 20) as average FROM
(SELECT SUM(Average) as hoogste FROM vwStand order by Average DESC limit 10) as high,
(SELECT SUM(Average) as laagste FROM vwStand order by Average ASC limit 10) as low
;
Dit zou volgens mij het gemiddelde van de hoogste en laagste 10 gemiddelden moeten geven, maar bind me er niet op vast.
Denk dat dit meer de richting is waar je in moet denken als je het allemaal in SQL wil doen.