Seizoenen en uitslagen tabel in PHP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

G Jansma

G Jansma

23/11/2015 18:47:04
Quote Anchor link
Ik wil een overzicht maken van uitslagen en seizoenen, maar ik kom er niet uit. Zie de afbeelding voor een voorbeeld. Het kan dus voorkomen dat een speler in een seizoen geen uitslag heeft.

Iemand enig idee hoe ik dit het best zou kunnen aanroepen en verwerken in php?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


Een speler bestaat uit id, naam
Een uitslag bestaat uit uitslag_wedstrijd_id, uitslag_speler, uitslag_positie en seizoen.

Afbeelding
Gewijzigd op 23/11/2015 18:49:22 door G Jansma
 
PHP hulp

PHP hulp

24/12/2024 04:10:32
 
Jan de Laet

Jan de Laet

23/11/2015 19:11:56
Quote Anchor link
Dit is mogelijk een optie, maar die moet wel aangepast worden als er een nieuw seizoen bijkomt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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
 
- SanThe -

- SanThe -

23/11/2015 19:32:01
Quote Anchor link
G Jansma op 23/11/2015 18:47:04:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


De u van u.uitslag_speler bestaat.
Maar de s van s.id zie ik niet.
 
G Jansma

G Jansma

23/11/2015 20:45:34
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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>";

}
 
Jan de Laet

Jan de Laet

24/11/2015 08:18:15
Quote Anchor link
@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")
 
G Jansma

G Jansma

24/11/2015 08:57:38
Quote Anchor link
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")



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
 
Jan de Laet

Jan de Laet

24/11/2015 09:09:11
Quote Anchor link
Ah ok, ik zie wat er gebeurd.
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)
PHP script in nieuw venster Selecteer het PHP script
1
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


Ik heb dus MAX toegevoegd voor elk seizoen en s.naam in de GROUP BY.
 
G Jansma

G Jansma

24/11/2015 09:52:30
Quote Anchor link
Dat werkt inderdaad, super! Het enige probleem wat er nu dus nog is is dat ik niet weet in welke seizoenen de wedstrijd bestond. Zowel in de query als in de echo. Enig idee hoe ik dat het best kan aanpakken?


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)
PHP script in nieuw venster Selecteer het PHP script
1
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'];}


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
 
Jan de Laet

Jan de Laet

24/11/2015 10:10:55
Quote Anchor link
Ik begrijp je niet helemaal hier. Het veld s1 is toch seizoen 15/16, enz..

Om de seizoenen op te halen kun je beter dit gebruiken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT DISTINCT seizoen FROM uitslagen ORDER BY seizoen DESC


of

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT seizoen FROM uitslagen GROUP BY seizoen ORDER BY seizoen DESC


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
 
G Jansma

G Jansma

24/11/2015 10:24:11
Quote Anchor link
Ik had s1 even verandert in s16, omdat er natuurlijknog seizoenen gaan komen en dan weet ik beter welk seizoen het is. De Where heb ik erin gezet omdat wedstrijd_id 1 bijvoorbeeld vaker is geweest dan wedstrijd_id 2, en anders krijg je ook seizoenen waarin geen uitslag is. Ik heb het wel even gewijzigd in SELECT seizoen FROM, dat scheelt natuurlijk weer.

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.
 
Jan de Laet

Jan de Laet

24/11/2015 10:40:45
Quote Anchor link
Even uit de losse pols getikt (voor het dynamisch opbouwen):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
 
G Jansma

G Jansma

24/11/2015 13:56:53
Quote Anchor link
Dat ga ik eens even zorgvuldig bekijken. Enorm bedankt voor de hulp!
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

28/11/2015 08:34:46
Quote Anchor link
Een andere benadering is om de crosstab in PHP te verwerken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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'] : '&nbsp;';
            ?>

            <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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.