Standen toont geen clubs die nog geen duel hebben gespeeld

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

R R

R R

31/05/2022 17:24:31
Quote Anchor link
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?

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
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'
 
PHP hulp

PHP hulp

26/04/2024 22:38:37
 
Ivo P

Ivo P

31/05/2022 18:42:19
Quote Anchor link
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:


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


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)
 
R R

R R

31/05/2022 22:27:01
Quote Anchor link
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.
 
Ad Fundum

Ad Fundum

01/06/2022 10:06:48
Quote Anchor link
Wat een draak van een query. Als ik hem uitschrijf dan is die best wel inefficiënt met al die IFs en die SUMs:
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
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.
 
Ivo P

Ivo P

01/06/2022 11:21:43
Quote Anchor link
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.


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

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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
ORDER BY
   (gewonnen * 3 + gelijk) DESC,
   doelsaldo DESC


edit--
de aliassen "w" ook aangepast naar "wuit" of "wthuis"

Toevoeging op 01/06/2022 12:42:32:

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


kan ook aangepast worden, zodat je kunt varen op alleen de scores en de 3 extra kolommen niet nodig hebt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
Gewijzigd op 01/06/2022 12:43:22 door Ivo P
 
R R

R R

01/06/2022 12:49:06
Quote Anchor link
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.


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

Ivo P

01/06/2022 13:07:25
Quote Anchor link
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.
 
R R

R R

01/06/2022 17:39:59
Quote Anchor link
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.



Datum type Date wordt opgeslagen als yyyy-mm-dd
Alle overige relevante kolommen zoals thuis, uit, gesp, thg etc. SMALLINT
 
Ivo P

Ivo P

01/06/2022 22:20:45
Quote Anchor link
wat is exact de query die je uitvoert als je maar 2 clubs krijgt?

(dus met de ingevulde waarden van seizoen en datum)
 
R R

R R

02/06/2022 22:38:40
Quote Anchor link
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)


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)
PHP script in nieuw venster Selecteer het PHP script
1
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
 
Ivo P

Ivo P

03/06/2022 09:33:13
Quote Anchor link
Dat is de query waar we mee begonnen zijn....

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.
 



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.