Seizoenen en uitslagen tabel in PHP
Iemand enig idee hoe ik dit het best zou kunnen aanroepen en verwerken in php?
Code (php)
1
2
3
4
2
3
4
SELECT * FROM speler
JOIN uitslagen AS u ON s.id = u.uitslag_speler
WHERE uitslag_wedstrijd_id = 1
ORDER BY uitslag_positie
JOIN uitslagen AS u ON s.id = u.uitslag_speler
WHERE uitslag_wedstrijd_id = 1
ORDER BY uitslag_positie
Een speler bestaat uit id, naam
Een uitslag bestaat uit uitslag_wedstrijd_id, uitslag_speler, uitslag_positie en seizoen.
Gewijzigd op 23/11/2015 18:49:22 door G Jansma
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT s.id, s.naam
, IF(u.seizoen="15/16", u.uitslag_positie, NULL) AS s1
, IF(u.seizoen="14/15", u.uitslag_positie, NULL) AS s2
, IF(u.seizoen="13/14", u.uitslag_positie, NULL) AS s3
, IF(u.seizoen="12/13", u.uitslag_positie, NULL) AS s4
, IF(u.seizoen="11/12", u.uitslag_positie, NULL) AS s5
FROM speler s
LEFT JOIN uitslagen AS u ON s.id = u.uitslag_speler
GROUP BY s.id
, IF(u.seizoen="15/16", u.uitslag_positie, NULL) AS s1
, IF(u.seizoen="14/15", u.uitslag_positie, NULL) AS s2
, IF(u.seizoen="13/14", u.uitslag_positie, NULL) AS s3
, IF(u.seizoen="12/13", u.uitslag_positie, NULL) AS s4
, IF(u.seizoen="11/12", u.uitslag_positie, NULL) AS s5
FROM speler s
LEFT JOIN uitslagen AS u ON s.id = u.uitslag_speler
GROUP BY s.id
Als je nieuwe seizoenen automatisch toe wilt toevoegen zul je eerst de seizoenen op moeten halen uit uitslagen en vervolgens bovenstaande sql dynamisch moeten opbouwen met een IF voor elk seizoen.
Gewijzigd op 23/11/2015 19:19:10 door Jan de Laet
G Jansma op 23/11/2015 18:47:04:
De u van u.uitslag_speler bestaat.
Maar de s van s.id zie ik niet.
Jan de Laet op 23/11/2015 19:11:56:
Dit is mogelijk een optie, maar die moet wel aangepast worden als er een nieuw seizoen bijkomt:
Als je nieuwe seizoenen automatisch toe wilt toevoegen zul je eerst de seizoenen op moeten halen uit uitslagen en vervolgens bovenstaande sql dynamisch moeten opbouwen met een IF voor elk seizoen.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT s.id, s.naam
, IF(u.seizoen="15/16", u.uitslag_positie, NULL) AS s1
, IF(u.seizoen="14/15", u.uitslag_positie, NULL) AS s2
, IF(u.seizoen="13/14", u.uitslag_positie, NULL) AS s3
, IF(u.seizoen="12/13", u.uitslag_positie, NULL) AS s4
, IF(u.seizoen="11/12", u.uitslag_positie, NULL) AS s5
FROM speler s
LEFT JOIN uitslagen AS u ON s.id = u.uitslag_speler
GROUP BY s.id
, IF(u.seizoen="15/16", u.uitslag_positie, NULL) AS s1
, IF(u.seizoen="14/15", u.uitslag_positie, NULL) AS s2
, IF(u.seizoen="13/14", u.uitslag_positie, NULL) AS s3
, IF(u.seizoen="12/13", u.uitslag_positie, NULL) AS s4
, IF(u.seizoen="11/12", u.uitslag_positie, NULL) AS s5
FROM speler s
LEFT JOIN uitslagen AS u ON s.id = u.uitslag_speler
GROUP BY s.id
Als je nieuwe seizoenen automatisch toe wilt toevoegen zul je eerst de seizoenen op moeten halen uit uitslagen en vervolgens bovenstaande sql dynamisch moeten opbouwen met een IF voor elk seizoen.
Dat komt al een heel eind in de goede riching. Maar hoe kan ik ze dan het best aanroepen? Iemand met 5 resultaten komt namelijk 5x langs, maar iemand met 1 resultaat maar 1x.
En hoe zou ik ervoor kunnen zorgen dat alleen bestaan seizoenen langskomen? Want niet alle wedstrijden hebben evenveel seizoenen.
Quote:
while($row1 = mysqli_fetch_array($query_xs)){
echo "<div>[{$row1['s1']}] [{$row1['s2']}] [{$row1['s3']}] [{$row1['s4']}] [{$row1['s5']}]</div>";
}
echo "<div>[{$row1['s1']}] [{$row1['s2']}] [{$row1['s3']}] [{$row1['s4']}] [{$row1['s5']}]</div>";
}
Maak een tabel en plaats de row1 waardes tussen <td> en </td>, bijv <td>[{$row1['s1']}]</td> enz.
Door voor de GROUP BY een WHERE op te nemen kun je de seizoenen filteren, bijv:
WHERE u.seizoen in ("15/16", "14/15", "13/14", "12/13", "11/12")
Jan de Laet op 24/11/2015 08:18:15:
@G, bedoel je met "maar hoe kan ik ze het beste aanroepen?" hoe je ze wilt presenteren in 5 kolommen?
Maak een tabel en plaats de row1 waardes tussen <td> en </td>, bijv <td>[{$row1['s1']}]</td> enz.
Door voor de GROUP BY een WHERE op te nemen kun je de seizoenen filteren, bijv:
WHERE u.seizoen in ("15/16", "14/15", "13/14", "12/13", "11/12")
Maak een tabel en plaats de row1 waardes tussen <td> en </td>, bijv <td>[{$row1['s1']}]</td> enz.
Door voor de GROUP BY een WHERE op te nemen kun je de seizoenen filteren, bijv:
WHERE u.seizoen in ("15/16", "14/15", "13/14", "12/13", "11/12")
Ik wil ze inderdaad in een div zetten, maar dat is niet zo zeer het probleem. Ik weet vooral niet wat ik in de while moet zetten, zodat of een seizoen langskomt of een streepje of iets dergelijks wordt.
Ik roep nu in de while dus s1, s2, s3, s4 tegelijk aan dus dan krijg je dit. (Voor het effect heb ik er even [] en een . laten staan zodat je ziet dat er wat gebeurd.
Iemand met vier resultaten krijgt namelijk:
[1][.][.][.]
[.][2][.][.]
[.][.][3][.]
[.][.][.][4]
Iemand met één resultaat krijgt:
[.][.][.][4]
Edit: Ik heb overigens al een array gemaakt in welke seizoenen de wedstrijd bestond.
Gewijzigd op 24/11/2015 08:59:48 door G Jansma
We gebruiken group by en dan moeten we natuurlijk ook een aggregate functie gebruiken om maar 1 rij per speler te krijgen.
Probeer dit eens:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT s.id, s.naam
, MAX(IF(u.seizoen="15/16", u.uitslag_positie, NULL)) AS s1
, MAX(IF(u.seizoen="14/15", u.uitslag_positie, NULL)) AS s2
, MAX(IF(u.seizoen="13/14", u.uitslag_positie, NULL)) AS s3
, MAX(IF(u.seizoen="12/13", u.uitslag_positie, NULL)) AS s4
, MAX(IF(u.seizoen="11/12", u.uitslag_positie, NULL)) AS s5
FROM speler s
LEFT JOIN uitslagen AS u ON s.id = u.uitslag_speler
GROUP BY s.id, s.naam
, MAX(IF(u.seizoen="15/16", u.uitslag_positie, NULL)) AS s1
, MAX(IF(u.seizoen="14/15", u.uitslag_positie, NULL)) AS s2
, MAX(IF(u.seizoen="13/14", u.uitslag_positie, NULL)) AS s3
, MAX(IF(u.seizoen="12/13", u.uitslag_positie, NULL)) AS s4
, MAX(IF(u.seizoen="11/12", u.uitslag_positie, NULL)) AS s5
FROM speler s
LEFT JOIN uitslagen AS u ON s.id = u.uitslag_speler
GROUP BY s.id, s.naam
Ik heb dus MAX toegevoegd voor elk seizoen en s.naam in de GROUP BY.
In de While had ik een in_array functie geplaatst, maar nu ziet hij alle seizoenen als 15-16, dus dat werkt niet meer.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$sql = ("SELECT * FROM uitslagen WHERE uitslag_wedstrijd_id = '".$id."' GROUP BY seizoen ORDER BY seizoen DESC");
$result = mysqli_query($con, $sql);
$season_array = array();
while($row3=mysqli_fetch_array($result)) {
$season_array[] = $row3['seizoen'];}
$result = mysqli_query($con, $sql);
$season_array = array();
while($row3=mysqli_fetch_array($result)) {
$season_array[] = $row3['seizoen'];}
Edit: Dat kan ik natuurlijk in de echo ook als tekst doen ipv als variable
if (in_array('15-16', $season_array1)) {echo "[{$row['s16']}]";}
Gewijzigd op 24/11/2015 10:03:58 door G Jansma
Om de seizoenen op te halen kun je beter dit gebruiken:
of
Ik denk ook dat een WHERE hier niet nodig is. Of het mocht zijn dat je alleen in bepaalde seizoenen geïnteresseerd bent.
Als je het array met seizoenen hebt, kun je de spelers query dynamisch opbouwen. Je begint met de select van regel 1 en eindigt met de 4 regels vanaf regel 7. Daartussen heb je een ", MAX" regel per element in seizoenen array, waarbij je de 15/16 in een WHILE vervangt door het element uit je array en een tellertje voor de s1, s2 enz..
Gewijzigd op 24/11/2015 10:12:19 door Jan de Laet
Ik heb voor nu even een waslijst in de query gezet aan seizoenen, en ook in de echo met if in array, al weet ik niet of dat heel veel laadtijd vergt? De uitkomst is in ieder geval hoe ik het wil. Dat dynamisch opbouwen kan ik me nog niet helemaal bedenken hoe dat er uit zou moeten zien, en met tellertjes ben ik ook nog niet zo handig.
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// maak een begin met de sql voor de spelers en zet teller op 0
$sqlspelers = "SELECT s.id, s.naam ";
$teller = 0;
// haal de seizoenen op
$sql = 'SELECT seizoen FROM uitslagen GROUP BY seizoen ORDER BY seizoen DESC';
$result = mysqli_query($con, $sql);
$season_array = array();
//loop de seizoenen af en bouw de sql uit voor elk seizoen
while($row3=mysqli_fetch_array($result)) {
$season_array[] = $row3['seizoen'];
$teller = $teller + 1;
$sqlspelers .= ' , MAX(IF(u.seizoen="' . $row3['seizoen'] . '", u.uitslag_positie, NULL)) AS s' . $teller;
}
// sluit de sql af
$sqlspelers .= ' FROM speler s
LEFT JOIN uitslagen AS u ON s.id = u.uitslag_speler
GROUP BY s.id, s.naam';
//voer de sql uit
$resultspeler = mysqli_query($con, $sqlspelers);
$sqlspelers = "SELECT s.id, s.naam ";
$teller = 0;
// haal de seizoenen op
$sql = 'SELECT seizoen FROM uitslagen GROUP BY seizoen ORDER BY seizoen DESC';
$result = mysqli_query($con, $sql);
$season_array = array();
//loop de seizoenen af en bouw de sql uit voor elk seizoen
while($row3=mysqli_fetch_array($result)) {
$season_array[] = $row3['seizoen'];
$teller = $teller + 1;
$sqlspelers .= ' , MAX(IF(u.seizoen="' . $row3['seizoen'] . '", u.uitslag_positie, NULL)) AS s' . $teller;
}
// sluit de sql af
$sqlspelers .= ' FROM speler s
LEFT JOIN uitslagen AS u ON s.id = u.uitslag_speler
GROUP BY s.id, s.naam';
//voer de sql uit
$resultspeler = mysqli_query($con, $sqlspelers);
Dat ga ik eens even zorgvuldig bekijken. Enorm bedankt voor de hulp!
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
58
59
60
61
62
63
64
65
66
67
68
69
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
58
59
60
61
62
63
64
65
66
67
68
69
<?php
$sql = 'SELECT p.id, p.naam,
s.seizoen, MAX(u.uitslag_positie) max_pos
COUNT(u.uitslag_speler) gespeeld
FROM spelers p
CROSS JOIN
(
SELECT DISTINCT seizoen
FROM uitslagen
) s
LEFT JOIN uitlsagen u
ON p.id = u.uitslag_speler AND s.seizoen = u.seizoen
GROUP BY p.id, p.naam, s.zeizoen
ORDER BY p.id, s.seizoen DESC';
if (false != $result = mysqli_query($con, $sql))
{
$cur_player = -1;
$players = array();
while ($row = mysqli_fetch_assoc($result))
{
if ($row['id'] != $cur_player)
{
$cur_player = $row['id'];
$players[$cur_player] = array('naam' => $row['naam'],
'resultaten' => array(),);
}
$players[$cur_player]['resultaten'][$row['seizoen']] =
array('max_pos' => $row['max_pos'],
'gespeeld' => $row['gespeeld'],);
}
mysqli_free_result($result);
$seasons = array_keys($players[$cur_player]['resultaten']);
?>
<table>
<thead>
<tr>
<th>Id</th>
<th>Naam</th>
<th><?php echo implode('</th><th>', $seasons); ?></th>
</tr>
</thead>
<tbody>
<?php
foreach ($players as $id => $player)
{ ?>
<tr>
<td><?php echo $id; ?></td>
<td><?php echo $player['naam']; ?></td>
<?php
foreach ($seasons as $season)
{
$s = $player['resultaten'][$season]['gespeeld'] != 0 ? $player['resultaten'][$season]['gespeeld']
. ' - ' . $player['resultaten'][$season]['max_pos'] : ' ';
?>
<td><?php echo $s; ?></td>
<?php
}
?>
</tr>
<?php
}
}
else
{
// wat dan ook
}
?>
$sql = 'SELECT p.id, p.naam,
s.seizoen, MAX(u.uitslag_positie) max_pos
COUNT(u.uitslag_speler) gespeeld
FROM spelers p
CROSS JOIN
(
SELECT DISTINCT seizoen
FROM uitslagen
) s
LEFT JOIN uitlsagen u
ON p.id = u.uitslag_speler AND s.seizoen = u.seizoen
GROUP BY p.id, p.naam, s.zeizoen
ORDER BY p.id, s.seizoen DESC';
if (false != $result = mysqli_query($con, $sql))
{
$cur_player = -1;
$players = array();
while ($row = mysqli_fetch_assoc($result))
{
if ($row['id'] != $cur_player)
{
$cur_player = $row['id'];
$players[$cur_player] = array('naam' => $row['naam'],
'resultaten' => array(),);
}
$players[$cur_player]['resultaten'][$row['seizoen']] =
array('max_pos' => $row['max_pos'],
'gespeeld' => $row['gespeeld'],);
}
mysqli_free_result($result);
$seasons = array_keys($players[$cur_player]['resultaten']);
?>
<table>
<thead>
<tr>
<th>Id</th>
<th>Naam</th>
<th><?php echo implode('</th><th>', $seasons); ?></th>
</tr>
</thead>
<tbody>
<?php
foreach ($players as $id => $player)
{ ?>
<tr>
<td><?php echo $id; ?></td>
<td><?php echo $player['naam']; ?></td>
<?php
foreach ($seasons as $season)
{
$s = $player['resultaten'][$season]['gespeeld'] != 0 ? $player['resultaten'][$season]['gespeeld']
. ' - ' . $player['resultaten'][$season]['max_pos'] : ' ';
?>
<td><?php echo $s; ?></td>
<?php
}
?>
</tr>
<?php
}
}
else
{
// wat dan ook
}
?>
Vanwege de cross join krijgt elke speler elk seizoen toekend. Wil je alleen bepaalde seizoenen plaats je een WHERE in de subquery van de cross join.