Ranking in MYSQL/PHP query
Ik heb voor een dart competitie een tabel aangemaakt in mijn MYSQL database met bijbehorende kolommen:
- ID, Spelers, hondertachtig, Gespeeld en Punten
Ik zou graag de gegevens willen ranken op de hoeveelheid punten en dat deze ranking automatisch wordt aangemaakt.
Momenteel heb ik een tweede tabel aangemaakt voor de ranking maar dit is niet flexibel genoeg.
Zie hier mijn code die ik nu gebruik:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
$servername = "localhost";
$username = "****";
$password = "****";
$dbname = "****";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT Speler, Gespeeld, honderdtachtig, Punten FROM seizoen16 ORDER BY punten DESC";
$result = $conn->query($sql);
echo "<table class='seizoentabel2' align='left'>
<th>Pos.</th>
<tr><td>1</td></tr>
<tr><td>2</td></tr>
<tr><td>3</td></tr>
<tr><td>4</td></tr>
<tr><td>5</td></tr>
<tr><td>6</td></tr>
<tr><td>7</td></tr>
<tr><td>8</td></tr>
<tr><td>9</td></tr>
<tr><td>10</td></tr>
<tr><td>11</td></tr>
<tr><td>12</td></tr>
<tr><td>13</td></tr>
<tr><td>14</td></tr>
<tr><td>15</td></tr>
<tr><td>16</td></tr>
<tr><td>17</td></tr>
<tr><td>18</td></tr>
<tr><td>19</td></tr>
<tr><td>20</td></tr>
</table>";
echo "<table class='seizoentabel'><th>Speler</th><th>Gespeeld</th><th>180</th><th>Punten</th>";
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo
"<tr><td>" . $row["Speler"]."</td>".
" " . "<td class='center'>" . $row["Gespeeld"]."</td>".
"<td class='center'>" . $row["honderdtachtig"]."</td>".
"<td class='center'>" . $row["Punten"]."</td></tr>";
}
echo "</table><br class='clear:both'>";
} else {
echo "0 results";
}
$conn->close();
?>
$servername = "localhost";
$username = "****";
$password = "****";
$dbname = "****";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT Speler, Gespeeld, honderdtachtig, Punten FROM seizoen16 ORDER BY punten DESC";
$result = $conn->query($sql);
echo "<table class='seizoentabel2' align='left'>
<th>Pos.</th>
<tr><td>1</td></tr>
<tr><td>2</td></tr>
<tr><td>3</td></tr>
<tr><td>4</td></tr>
<tr><td>5</td></tr>
<tr><td>6</td></tr>
<tr><td>7</td></tr>
<tr><td>8</td></tr>
<tr><td>9</td></tr>
<tr><td>10</td></tr>
<tr><td>11</td></tr>
<tr><td>12</td></tr>
<tr><td>13</td></tr>
<tr><td>14</td></tr>
<tr><td>15</td></tr>
<tr><td>16</td></tr>
<tr><td>17</td></tr>
<tr><td>18</td></tr>
<tr><td>19</td></tr>
<tr><td>20</td></tr>
</table>";
echo "<table class='seizoentabel'><th>Speler</th><th>Gespeeld</th><th>180</th><th>Punten</th>";
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo
"<tr><td>" . $row["Speler"]."</td>".
" " . "<td class='center'>" . $row["Gespeeld"]."</td>".
"<td class='center'>" . $row["honderdtachtig"]."</td>".
"<td class='center'>" . $row["Punten"]."</td></tr>";
}
echo "</table><br class='clear:both'>";
} else {
echo "0 results";
}
$conn->close();
?>
Ik wil dus graag de tabel "seizoentabel2" verwijderen en ervoor zorgen dat de ranking automatisch wordt gemaakt. Heeft iemand hier ervaring mee die mij opweg kan helpen? Alvast bedankt!
Bijvoorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
echo "<table class='seizoentabel'><th>Ranking</th><th>Speler</th><th>Gespeeld</th><th>180</th><th>Punten</th>";
if ($result->num_rows > 0) {
// output data of each row
$i = 1;
while($row = $result->fetch_assoc()) {
echo
"<tr><td>" . $i."</td>".
" " . "<td>" . $row["Speler"]."</td>".
" " . "<td class='center'>" . $row["Gespeeld"]."</td>".
"<td class='center'>" . $row["honderdtachtig"]."</td>".
"<td class='center'>" . $row["Punten"]."</td></tr>";
$i++;
}
echo "</table><br class='clear:both'>";
} else {
echo "0 results";
}
?>
echo "<table class='seizoentabel'><th>Ranking</th><th>Speler</th><th>Gespeeld</th><th>180</th><th>Punten</th>";
if ($result->num_rows > 0) {
// output data of each row
$i = 1;
while($row = $result->fetch_assoc()) {
echo
"<tr><td>" . $i."</td>".
" " . "<td>" . $row["Speler"]."</td>".
" " . "<td class='center'>" . $row["Gespeeld"]."</td>".
"<td class='center'>" . $row["honderdtachtig"]."</td>".
"<td class='center'>" . $row["Punten"]."</td></tr>";
$i++;
}
echo "</table><br class='clear:both'>";
} else {
echo "0 results";
}
?>
Je kan dan die andere tabel weg doen.
Gewijzigd op 11/11/2016 12:45:15 door Sander van t Hullenaar
Bedankt sander, ik heb je code uitgeprobeerd maar er komt nu overal als rank 1 te staan, maar ik zou graag 1 tot 20 willen zien (er zijn 20 spelers). Weet je toevallig hoe ik dit voor elkaar kan krijgen?
Dan zou hij het moeten doen, kan je anders eens laten zien wat je nu hebt?
Vooral de $i++; is belangrijk, die telt er steeds 1 bij op.
ah er stond nog geen ++ in de code, maar nu ik hem erbij heb gezet werkt hij perfect, bedankt sander je bent een held!
En wat als 2 of meer personen evenveel punten hebben?
De ranking werkt ook hier, alleen zijn er mensen die niks hebben gegooid, ik zou dus graag willen dat deze mensen niet in de lijst worden weergegeven.
Oftewel als bovenhonderd leeg is dan moet hij deze speler niet laten zien.
Wellicht dat je mij hier ook bij kunt helpen sander?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
$servername = "localhost";
$username = "arjan";
$password = "scripting123";
$dbname = "s4d";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT Speler, bovenhonderd FROM seizoen16 ORDER BY bovenhonderd DESC";
$result = $conn->query($sql);
echo "<table class='seizoentabel3'><th>Pos.</th><th>Speler</th><th>Finish(es) 100+</th>";
$i = 1;
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo
"<tr><td>" . $i++."</td>".
"<td class=>" . $row["Speler"]."</td>".
" " . "<td class='center'>" . $row["bovenhonderd"]."</td></tr>";
}
echo "</table><br class='clear:both'>";
} else {
echo "0 results";
}
$conn->close();
?>
$servername = "localhost";
$username = "arjan";
$password = "scripting123";
$dbname = "s4d";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT Speler, bovenhonderd FROM seizoen16 ORDER BY bovenhonderd DESC";
$result = $conn->query($sql);
echo "<table class='seizoentabel3'><th>Pos.</th><th>Speler</th><th>Finish(es) 100+</th>";
$i = 1;
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo
"<tr><td>" . $i++."</td>".
"<td class=>" . $row["Speler"]."</td>".
" " . "<td class='center'>" . $row["bovenhonderd"]."</td></tr>";
}
echo "</table><br class='clear:both'>";
} else {
echo "0 results";
}
$conn->close();
?>
Toevoeging op 11/11/2016 13:19:52:
Ivo P op 11/11/2016 13:10:05:
En wat als 2 of meer personen evenveel punten hebben?
Goeie Ivo! Echter zal dat niet snel voorkomen, maar heb je eventueel een idee hoe we dit kunnen oplossen?
komt er volgend seizoen een tabel seizoen17?
In dat geval zou je beter de tabel omnoemen naar iets zonder nummer en dan een extra kolom toevoegen: seizoennr.
In die kolom sla je dan voor seizoen 16 het getal 16 op en volgend jaar het getal 17. Dat maakt dat je niet in al je code op zoek moet naar "seizoen16" als het seizoen wisselt. Bovendien kun je dan rechtstreeks een vergelijk maken dussen de score in het ene en het andere seizoen.
Ivo P op 11/11/2016 13:21:39:
FROM seizoen16
komt er volgend seizoen een tabel seizoen17?
In dat geval zou je beter de tabel omnoemen naar iets zonder nummer en dan een extra kolom toevoegen: seizoennr.
In die kolom sla je dan voor seizoen 16 het getal 16 op en volgend jaar het getal 17. Dat maakt dat je niet in al je code op zoek moet naar "seizoen16" als het seizoen wisselt. Bovendien kun je dan rechtstreeks een vergelijk maken dussen de score in het ene en het andere seizoen.
komt er volgend seizoen een tabel seizoen17?
In dat geval zou je beter de tabel omnoemen naar iets zonder nummer en dan een extra kolom toevoegen: seizoennr.
In die kolom sla je dan voor seizoen 16 het getal 16 op en volgend jaar het getal 17. Dat maakt dat je niet in al je code op zoek moet naar "seizoen16" als het seizoen wisselt. Bovendien kun je dan rechtstreeks een vergelijk maken dussen de score in het ene en het andere seizoen.
Dat is niet nodig, voor elk seizoen maken we simpelweg een nieuwe tabel aan, en het vergelijken tussen seizoenen is iets wat we niet gebruiken. De code is nu bijna zoals we het willen hebben, alleen willen we dus bij de tweede tabel ervoor zorgen dat waneer er geen gegevens staan in "bovenhonderd" dat deze Spelers niet worden getoond.
Door
Kun je mij vertellen wat de <> precies doet? Dan leer ikzelf de code beter begrijpen :)
De <> is de tegenhanger van =.
Het betekent dus "is niet".
Oke dankje nu is het voor mij duidelijk!