Standen op basis van onderstaande Query werkt prima, maar laat alleen de teams zien die op de betreffende datum of eerder al een wedstrijd hebben gespeeld.
De variable ".$punten wordt bepaald aan de hand van welk seizoen het is. Tegenwoordig drie punten en vroeger twee punten per overwinning.
Ik heb nog een tabel waarin de clubs (clubid) gekoppeld zijn aan een bepaald seizoen. Op één of andere manier zou onderstaande query uitgebreid moeten worden met deze Tabel. Maar ik kom er niet uit.
Iemand een suggestie?
select c.club,c.clubid as clubidstand,c.clubid,
(sum(if(w.thuis=c.clubid,w.thwin,0)) + sum(if(w.uit=c.clubid,w.uitwin,0))) as gew,
(sum(if(w.thuis=c.clubid,w.thgel,0)) + sum(if(w.uit=c.clubid,w.uitgel,0))) as gel,
(sum(if(w.thuis=c.clubid,w.thver,0)) + sum(if(w.uit=c.clubid,w.uitver,0))) as verl,
(sum(if(w.thuis=c.clubid,w.thwin*'".$punten."',0)) + sum(if(w.uit=c.clubid,w.uitwin*'".$punten."',0)))+(sum(if(w.thuis=c.clubid,w.thgel,0)) + sum(if(w.uit=c.clubid,w.uitgel,0))) as pnt,
(sum(if(w.thuis=c.clubid,w.thwin,0)) + sum(if(w.uit=c.clubid,w.uitwin,0)))
+(sum(if(w.thuis=c.clubid,w.thgel,0)) + sum(if(w.uit=c.clubid,w.uitgel,0)))
+(sum(if(w.thuis=c.clubid,w.thver,0)) + sum(if(w.uit=c.clubid,w.uitver,0))) as gesp,
(sum(if(w.thuis=c.clubid,w.thg,0)) + sum(if(w.uit=c.clubid,w.uitg,0))) as voor,
(sum(if(w.thuis=c.clubid,w.uitg,0)) + sum(if(w.uit=c.clubid,w.thg,0))) as tegen,
(sum(if(w.thuis=c.clubid,w.thg,0)) + sum(if(w.uit=c.clubid,w.uitg,0)))-
(sum(if(w.thuis=c.clubid,w.uitg,0)) + sum(if(w.uit=c.clubid,w.thg,0))) as doelsaldo
from wedstrijden w, clubs c
where w.seizoenid='".$seizoenid."' and (w.thuis=c.clubid or w.uit=c.clubid) and w.gesp=1 and w.datum <= '$datum'
Sowieso heb je in FROM de tabel Wedstrijden staan.
Je haalt dus in eerste instantie wedstrijden op. Dus als daarin alleen gespeelde wedstrijden worden opgevraagd ( w.datum <= '$datum' )
dan is het niet zo vreemd als clubs die nog niet gespeeld hebben helemaal niet gevonden worden.
Als je alle clubs wilt hebben en op basis van de uitslagen een stand wilt bepalen, zou ik meer iets verwachten als:
SELECT xyz
FROM clubs c
LEFT JOIN webstrijden w
ON (w.thuis = c.clubid OR w.uit = c.clubid)
AND w.seizoenid='".$seizoenid."'
AND w.datum <= '$datum'
AND w.gesp = 1
Hier mag je XYZ zelf aanvullen met de clubid/clubnaam en iets over de wedstrijd.
Dat is stap 1: je hebt dan als het goed is al je clubs in beeld en eventueel gespeelde wedstrijden erbij.
Volgende stap is om als jouw SUM() en IF() regels toe te voegen.
Ik heb geen zin om dat uit te puzzelen.
Wel heb ik het idee dat je kolommen hebt gemaakt om te bepalen of club-thuis gewonnen, verloren of gelijk gespeeld heeft.
Die info is ook af te leiden uit de scores
"als de uitslag 4-2 is, dan heeft de thuisclub gewonnen"
In een opzet met voor alles losse kolommen is het volgens mij mogelijk om aan te geven dat de de uitslag 4-2 is, en dat de thuis-ploeg zowel gelijkgespeeld heeft als verloren voor die wedstrijd"???
Maar goed: als je het zo opzet, soit.
Maar vergeet dan niet de regel
GROUP BY c.club, c.clubid
toe te voegen (en c.clubid hoef je niet 2x te selecteren)
Ik heb er voor gekozen om extra kolommen toe te voegen waarin thwin, thgel,thver etc. wordt opgeslagen nadat en wedstrijd is gespeeld. Ook geprobeerd zonder, maar de query om dan een stand te tonen duurt dan veel langer.
Geprobeerd met de left join. Resultaat blijft hetzelfde. Als de eerste wedstrijd van een seizoen is gespeeld en de volgende pas een dag later, dan worden alleen de twee clubs getoond die hebben gespeeld.
?Onbekende gebruiker
01-06-2022 10:06
Wat een draak van een query. Als ik hem uitschrijf dan is die best wel inefficiënt met al die IFs en die SUMs:
SELECT
clubs.club, -- naam ofzo?
clubs.clubid AS clubidstand, -- waarom dubbel ?
clubs.clubid,
SUM(IF(wedstrijden.thuis = clubs.clubid, wedstrijden.thwin, 0)
+ SUM(IF(wedstrijden.uit = clubs.clubid, wedstrijden.uitwin, 0)) AS gew, -- gewonnen
SUM(IF(wedstrijden.thuis = clubs.clubid, wedstrijden.thgel, 0))
+ SUM(IF(wedstrijden.uit = clubs.clubid, wedstrijden.uitgel, 0)) AS gel, -- gelijk
SUM(IF(wedstrijden.thuis = clubs.clubid, wedstrijden.thver, 0))
+ SUM(IF(wedstrijden.uit = clubs.clubid, wedstrijden.uitver, 0)) AS verl, -- verloren
SUM(IF(wedstrijden.thuis = clubs.clubid, wedstrijden.thwin * '".$punten."', 0))
+ SUM(IF(wedstrijden.uit = clubs.clubid, wedstrijden.uitwin * '".$punten."', 0))
+ SUM(IF(wedstrijden.thuis = clubs.clubid, wedstrijden.thgel, 0))
+ SUM(IF(wedstrijden.uit = clubs.clubid, wedstrijden.uitgel, 0)) AS pnt, -- punten
SUM(IF(wedstrijden.thuis = clubs.clubid, wedstrijden.thwin, 0))
+ SUM(IF(wedstrijden.uit = clubs.clubid, wedstrijden.uitwin,0))
+ SUM(IF(wedstrijden.thuis = clubs.clubid, wedstrijden.thgel, 0))
+ SUM(IF(wedstrijden.uit = clubs.clubid, wedstrijden.uitgel, 0))
+ SUM(IF(wedstrijden.thuis = clubs.clubid, wedstrijden.thver, 0))
+ SUM(IF(wedstrijden.uit = clubs.clubid, wedstrijden.uitver, 0)) AS gesp, -- gespeeld
SUM(IF(wedstrijden.thuis = clubs.clubid, wedstrijden.thg, 0))
+ SUM(IF(wedstrijden.uit = clubs.clubid, wedstrijden.uitg, 0)) AS voor,
SUM(IF(wedstrijden.thuis = clubs.clubid, wedstrijden.uitg, 0))
+ SUM(IF(wedstrijden.uit = clubs.clubid, wedstrijden.thg, 0)) AS tegen,
SUM(IF(wedstrijden.thuis = clubs.clubid, wedstrijden.thg, 0))
+ SUM(IF(wedstrijden.uit = clubs.clubid, wedstrijden.uitg, 0))
- SUM(IF(wedstrijden.thuis = clubs.clubid, wedstrijden.uitg, 0))
- SUM(IF(wedstrijden.uit = clubs.clubid, wedstrijden.thg, 0)) AS doelsaldo
FROM wedstrijden
INNER JOIN clubs
ON (wedstrijden.thuis = clubs.clubid
OR wedstrijden.uit = clubs.clubid)
WHERE wedstrijden.seizoenid = '".$seizoenid."' -- voor één seizoen (ongeacht jaar ?)
AND wedstrijden.gesp = 1 -- gespeeld
AND wedstrijden.datum <= '$datum' -- vandaag of in het verleden (vandaag kan ook nog niet gespeeld zijn!)
Ik sluit me aan bij Ivo. Maar als je vertelt wat precies je hebt opgeslagen en wat er je uit wilt hebben, dan is het een stuk eenvoudiger om je verder te helpen.
Geprobeerd met de left join. Resultaat blijft hetzelfde. Als de eerste wedstrijd van een seizoen is gespeeld en de volgende pas een dag later, dan worden alleen de twee clubs getoond die hebben gespeeld.
Hoe is dan je query geworden? Heb je soms nog een "where" toegevoegd?
Zoals die query is, zou hij namelijk alle clubs moeten ophalen en _eventueel_ gespeelde wedstrijden.
[size=xsmall]Toevoeging op 01/06/2022 11:32:46:[/size]
Ik denk trouwens dat je query overzichtelijker wordt als je 2x met de wedstrijden joint: voor uit en thuis
SELECT c.clubid, c.club,
SUM(wthuis.thwin) + SUM(wuit.uitwin) AS gewonnen,
SUM(wthuis.thgel) + SUM(wuit.uitgel) AS gelijk,
SUM(wthuis.thver) + SUM(wuit.uitver) AS verloren,
COUNT(1) AS gespeeld,
SUM(wthuis.thg) + SUM(wuit.uitg) AS voor,
SUM(wthuis.uitg) + SUM(wuit.thg) AS tegen,
SUM(wthuis.thg - wthuis.uitg) + SUM(wuit.uitg - wuit.thg) AS doelsaldo
FROM clubs c
LEFT JOIN webstrijden wthuis
ON wthuis.thuis = c.clubid
AND wthuis.seizoenid='".$seizoenid."'
AND wthuis.datum <= '$datum'
AND wthuis.gesp = 1
LEFT JOIN webstrijden wuit
ON wuit.uit = c.clubid
AND wuit.seizoenid='".$seizoenid."'
AND wuit.datum <= '$datum'
AND wuit.gesp = 1
GROUP BY c.clubid, c.club
TIP: gebruik duidelijke namen voor je kolommen.
thg is waarschijnlijk thuisgescoord?
en thgel = thuisgelijkgespeeld? uitver = uitverloren?
a) voluit is het direct duidelijk voor de lezer. Ook over 15 maanden.
b) je gaat je ook niet vergissen tussen thver of thverl, of thuisver.
[size=xsmall]Toevoeging op 01/06/2022 11:35:15:[/size]
aanvullend:
wel even kijken wat hij met de SUM() doet als een club alleen nog maar uitwedstrijden, danwel thuiswedstrijden gespeeld heeft, aangezien wuit.uitwin dan NULL is (en geen 0)
Misschien simpelste met coalesce() op te lossen.
[size=xsmall]Toevoeging op 01/06/2022 11:37:29:[/size]
En om ze op volgorde te krijgen:
ORDER BY
(gewonnen * 3 + gelijk) DESC,
doelsaldo DESC
edit--
de aliassen "w" ook aangepast naar "wuit" of "wthuis"
[size=xsmall]Toevoeging op 01/06/2022 12:42:32:[/size]
nog een aanvulling:
SUM(wthuis.thwin) + SUM(wuit.uitwin) AS gewonnen,
SUM(wthuis.thgel) + SUM(wuit.uitgel) AS gelijk,
SUM(wthuis.thver) + SUM(wuit.uitver) AS verloren
kan ook aangepast worden, zodat je kunt varen op alleen de scores en de 3 extra kolommen niet nodig hebt.
SUM(wthuis.thg > wthuis.uitg) + SUM(wuit.uitg > wuit.thg) AS gewonnen,
SUM(wthuis.thg = wthuis.uitg) + SUM(wuit.uitg = wuit.thg) AS gelijk,
SUM(wthuis.thg < wthuis.uitg) + SUM(wuit.uitg < wuit.thg) AS verloren
Ik sluit me aan bij Ivo. Maar als je vertelt wat precies je hebt opgeslagen en wat er je uit wilt hebben, dan is het een stuk eenvoudiger om je verder te helpen.
Wat ik wil is het volgende.
De stand op een bepaalde datum. Dat werkt nu prima zodra alle clubs minimaal één keer hebben gespeeld.
Maar aan het begin van een seizoen werkt het niet goed.
Stel je hebt 12 clubs. Dit zijn de eerste wedstrijden van een seizoen.
14-08-2021 club a - club h 1-0
15-08-2021 club b - club g
15-08-2021 club c - club f
etc.
Stand per 14-08-2021 zou dan moeten zijn
1. club a 1 gesp 3 pnt doelsaldo 1-0
2. club b 0 gesp 0 pnt doelsaldo 0-0
3. club d 0 gesp 0 pnt doelsaldo 0-0
4. etc.
12. club h 1 gesp 0 pnt doelsaldo 0-1
In mijn opzet wordt alleen club a en club h getoond. De overige dus niet.
note. Ik heb jouw query geprobeerd. Na toevoeging van group by clubs.clubid werden ook alleen de twee clubs getoond die op de eerste dag hebben gespeeld.
wat is exact de query die je uitvoert als je maar 2 clubs krijgt?
(dus met de ingevulde waarden van seizoen en datum)
Ik heb de Query iets 'uitgekleed'. Dus alleen even winst, gelijk en verlies. Dit even voor het overzicht. Als er dan twee clubs hebben gespeeld op 14 augustus 2016 komen alleen die twee clubs terug als resultaat. De overige clubs niet.
select c.club,c.clubid,
(sum(if(w.thuis=c.clubid,w.thwin,0)) + sum(if(w.uit=c.clubid,w.uitwin,0))) as gew,
(sum(if(w.thuis=c.clubid,w.thgel,0)) + sum(if(w.uit=c.clubid,w.uitgel,0))) as gel,
(sum(if(w.thuis=c.clubid,w.thver,0)) + sum(if(w.uit=c.clubid,w.uitver,0))) as verl
from wedstrijden w, clubs c
where w.seizoenid=5 and (w.thuis=c.clubid or w.uit=c.clubid) and w.gesp=1 and w.datum <= '2016-08-14'
group by c.clubid
order by gew desc,club asc