Standen toont geen clubs die nog geen duel 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?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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'
(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'
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:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
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
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)
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.
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
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
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!)
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.
R R op 31/05/2022 22:27:01:
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.
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.
Toevoeging op 01/06/2022 11:32:46:
Ik denk trouwens dat je query overzichtelijker wordt als je 2x met de wedstrijden joint: voor uit en thuis
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
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
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.
Toevoeging op 01/06/2022 11:35:15:
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.
Toevoeging op 01/06/2022 11:37:29:
En om ze op volgorde te krijgen:
edit--
de aliassen "w" ook aangepast naar "wuit" of "wthuis"
Toevoeging op 01/06/2022 12:42:32:
nog een aanvulling:
Code (php)
1
2
3
2
3
SUM(wthuis.thwin) + SUM(wuit.uitwin) AS gewonnen,
SUM(wthuis.thgel) + SUM(wuit.uitgel) AS gelijk,
SUM(wthuis.thver) + SUM(wuit.uitver) AS verloren
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.
Code (php)
1
2
3
2
3
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
SUM(wthuis.thg = wthuis.uitg) + SUM(wuit.uitg = wuit.thg) AS gelijk,
SUM(wthuis.thg < wthuis.uitg) + SUM(wuit.uitg < wuit.thg) AS verloren
Gewijzigd op 01/06/2022 12:43:22 door Ivo P
Ad Fundum op 01/06/2022 10:06:48:
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.
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.
14-08-2021 of 2101-08-14 (en wat is het type veld? VARCHAR of DATETIME dan wel DATE?)
Toevoeging op 01/06/2022 13:08:27:
sowieso misschien handig om de structuur van de tabellen te tonen hier. En dan met name de tabel Wedstrijden.
Ivo P op 01/06/2022 13:07:25:
Wat staat er in jouw datumveld?
14-08-2021 of 2101-08-14 (en wat is het type veld? VARCHAR of DATETIME dan wel DATE?)
Toevoeging op 01/06/2022 13:08:27:
sowieso misschien handig om de structuur van de tabellen te tonen hier. En dan met name de tabel Wedstrijden.
14-08-2021 of 2101-08-14 (en wat is het type veld? VARCHAR of DATETIME dan wel DATE?)
Toevoeging op 01/06/2022 13:08:27:
sowieso misschien handig om de structuur van de tabellen te tonen hier. En dan met name de tabel Wedstrijden.
Datum type Date wordt opgeslagen als yyyy-mm-dd
Alle overige relevante kolommen zoals thuis, uit, gesp, thg etc. SMALLINT
(dus met de ingevulde waarden van seizoen en datum)
Ivo P op 01/06/2022 22:20:45:
wat is exact de query die je uitvoert als je maar 2 clubs krijgt?
(dus met de ingevulde waarden van seizoen en datum)
(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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
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
(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
Daar staat:
SELECT iets
FROM wedstrijden
(en combineer met andere zaken)
Zoals ik in mijn eerste post zei: je haalt hier wedstrijden op.
Je wilt geen wedstrijden ophalen, maar clubs.
Dus je begint met
SELECT iets
FROM clubs.
(en combineer daarna met andere zaken, zoals wedstrijden en bijvoorbeeld sponsoren)
Zie mijn voorbeelden.