Hey,

Ik heb een probleem met het maken van een ranglijst. Ik ben op dit moment bezig met een projectje waarin ik een ranglist moet hebben waarin de spelers ($Spelers) op volgorde van het aantal punten ($Punten of $Punten*naam* (waarin *naam* de naam van de speler is). Nu is het probleem dat het aantal punten die de speler heeft worden berekend op het moment dat hij de pagina opent met zijn naam erin.

Een voorbeeld is dat als de speler Henk heet hij naar http://www.XX.nl/XX/Henk.php en daarin alle behaalde punten kan zien voor dingen die hij gedaan heeft.

Waarin de ranglijst er bijvoorbeeld zo uit moet komen te zien (Het liefst in een tabel):

1. Henk 12
2. Kees 6
2. Jan 6
4. Pietje 5

Ik hoop dat je het begrijpt, zo niet, dan zal ik proberen het duidelijker uit te leggen.

P.S. het spijt me als deze vraag niet op de goede plek staat. Misschien dat ik hem beter had kunnen zetten bij Algemene PHP scripting, maar dit is toch een vraag die voor iedereen wel handig kan zijn.
Je kunt in een query toch ook sorteren op een berekening?



SELECT naam, punten*12 - 4*id as depunten
FROM tabel
ORDER BY depunten


waarbij ik dan even er vanuit ga dat er een database bij betrokken is
Nee, er is geen database bij betrokken, omdat een database maken voor zoveel gegevens *ca. 200 per persoon* waarbij er meer dan 50 personen mee spelen is dit voor mij niet ideaal. En ook omdat alle gegevens opgeslagen moeten worden zal het wat lastiger gaan. Maar ik ga die van stackoverflow ff proberen. Toch bedankt!
1 tabel met users (met maar weinig kolommen: user_id, naam is al bijna genoeg)
1 tabel met soortengegevens (200 records in de kolommen soortgegeven_id en gegevensnaam)
1 tabel met waarden:
bevat user_id, soortgegeven_id en een kolom met waarde

Veel gegevens is niet een reden tegen een database, maar jusit een reden voor het gebruik van een database. Waarbij 50 * 200 = 10.000 records overigens nog helemaal niet als 'veel' wordt gezien bij een beetje database.
Dat jij nog niet weet wat een database is, is mijns inziens de reden tegen het gebruik van een database. Dat is niet erg, dat is een leermoment.
Erwin H op 08/12/2013 10:37:45

Veel gegevens is niet een reden tegen een database, maar jusit een reden voor het gebruik van een database. Waarbij 50 * 200 = 10.000 records overigens nog helemaal niet als 'veel' wordt gezien bij een beetje database.
Dat jij nog niet weet wat een database is, is mijns inziens de reden tegen het gebruik van een database. Dat is niet erg, dat is een leermoment.


Dat is zeker ook een reden :p, ik heb heel weinig ervaring met het gebruiken van een database, dus misschien tijd voor een eerste keer.
Alles werkt nu, maar nu heb ik een probleem dat wanneer 2 of meer spelers dezelfde punten hebben zij niet dezelfde plaats krijgen in de ranglijst. Iemand enig idee hoe ik dit moet fixen? Ik gebruik nu deze code:

<?
mysql_connect($mysql['host'], $mysql['username'], $mysql['password']);
mysql_select_db($mysql['database']);

$sql = mysql_query('SELECT *FROM `ranglijst` ORDER BY `ranglijst`.`Punten` ASC LIMIT 0, 1000 ') or die(mysql_error()); 
Print '<div class="CSSTableGenerator" >';
Print "<Table>"; 
echo "<tr><td>Plaats</td><td>Naam</td><td>Punten</td></tr>";
$i = 1;
 while($info = mysql_fetch_array( $sql )) 
 { 
 Print "<tr>"; 
 Print "<td>".$i++. "</td> "; 
 Print "<td>".$info['Deelnemer'] . "</td> "; 
 Print "<td>".$info['Punten'] . " </td></tr>"; 
 } 
 Print "</table></div>"; 
?>
Ik zou 2 rijen toevoegen in de database.

plaats en vorige_plaats.

En dan berekenen op welke plaats ze staan, heb je ook geen $1++ nodig.
Dan kun je simpel de rij plaats met een print weergeven.

Alleen zou ik niet met hoofdletters werken.

Dus als je de punten aan de deelnemers toekent, doe je aan het einde elke keer berekenen op welke plaats ze staan.

Hoop dat je er wat aan hebt.

Groet Mausie.


<?php
    //alle deelnemers er bij halen
    $sql_plaats = mysql_query("SELECT * FROM `ranglijst` ORDER BY punten DESC, deelnemer ASC")or die(mysql_error());

    $plaats = 1;
    $plaats_temp = 1;
    $punten_vorige_user = 0;

    while ($row_plaats = mysql_fetch_array($sql_plaats))
    {
        $user_id = $row_plaats['user_id'];
        $vorige_plaats = $row_plaats['plaats'];

        if ($row_plaats['punten'] < $punten_vorige_user)
        {
            $plaats = $plaats_temp;
        }

        $punten_vorige_user = $row_plaats['punten'];
        $plaats_temp += 1;

        //de juiste plaats toekennen aan de deelnemers
        $Update_plaats = mysql_query("UPDATE `ranglijst` SET vorige_plaats = '".$vorige_plaats."', plaats = '".$plaats."' WHERE user_id = '".$user_id."'");
    	}
        if($Update_plaats){
            print "Plaatsen zijn goed berekend";
        }else{
            print "Er is iets fout gegaan met de berekenen van de plaatsen Error: ". mysql_error;
        }
?>
Ik zou dat niet oplossen in de database.

Ik zou controleren wat het puntenaantal is bij de huidige run door de while-lus en wat het vorige puntenaantal (bij het doorlopen van de lus) was.
Indien gelijk --> i niet ophogen, maar tonen (wel een extra variabele om te bepalen hoeveel keren hetzelfde aantal punten voorkomt.
Indien ongelijk --> i ophogen met 1 of het aantal keren dat bleek dat hetzelfde puntenaantal was.
SQL alternatief:

SELECT
	naam,
	punten,
	FIND_IN_SET(punten, (SELECT punten FROM ranglijst ORDER BY punten DESC)) AS positie
FROM
	ranglijst
ORDER BY punten DESC, naam

FIND_IN_SET geeft de positie(index) van de eerst gevonden waarde

Reageren