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?

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.

Dit is mogelijk een optie, maar die moet wel aangepast worden als er een nieuw seizoen bijkomt:

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.
G Jansma op 23/11/2015 18:47:04

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

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.

while($row1 = mysqli_fetch_array($query_xs)){

echo "<div>[{$row1['s1']}] [{$row1['s2']}] [{$row1['s3']}] [{$row1['s4']}] [{$row1['s5']}]</div>";

}
@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")

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

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

$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']}]";}
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:

SELECT DISTINCT seizoen FROM uitslagen ORDER BY seizoen DESC


of


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..
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.
Even uit de losse pols getikt (voor het dynamisch opbouwen):

// 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);


Reageren