Resultaat twee subquery's net niet volledig

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jan van Veen

Jan van Veen

10/04/2021 23:01:30
Quote Anchor link
Ik wil graag vanuit een opstellingen tabel weten hoeveel doelpunten iemand heeft gemaakt én hoeveel daarvan als invaller.
Kom er niet helemaal uit.
Naam en aantal gescoord als invaller worden correct getoond.
Maar voor elk resultaat wordt bij iedere speler het totaal aantal gescoord getoond. En niet van de speler zelf.
Is ook logisch, omdat ik het bij de select van o2 het niet voor elkaar krijg om deze te koppelen aan p.persid of o3.persid.
Ik hoop dat ik mijn probleem zo helder heb verwoord.


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
SELECT  o2.gesc,o3.aantal,
            p.persid,p.voornaam,p.tussenvoegsel,p.achternaam
            FROM
              (select o.persid,sum(o.gesc) as gesc
               from opstelere o
               where o.gesc>0)  as o2,
            
             (select o.persid, sum(o.gesc) AS aantal
               FROM opstelere o
               where o.gesc>0 and ((o.volgorde>11 and o.volgorde<21) or (o.volgorde>31 and o.volgorde<39))
               GROUP BY o.persid ) AS o3          
                                  
              jOIN personen AS p ON p.persid = o3.persid  
                ORDER BY o3.aantal  DESC
 
PHP hulp

PHP hulp

22/09/2021 03:52:37
 
Jan R

Jan R

11/04/2021 09:11:34
Quote Anchor link
Sorry post in verkeerde vraag
Gewijzigd op 11/04/2021 09:13:48 door Jan R
 
Cor Zelf

Cor Zelf

11/04/2021 09:59:53
Quote Anchor link
Hallo Jan,

@"omdat ik het bij de select van o2 het niet voor elkaar krijg om deze te koppelen aan p.persid of o3.persid"
Dat is nooit logisch. :-)
Als de database relationeel is EN correct is genormaliseerd, en dan moet dit geen probleem zijn.
Ik zie dat er twee tabellen zijn en dan zou je met 1 JOIN alles kunnen pakken en output genereren naar keuze.
Kijk hier eens naar:
https://www.mysqltutorial.org/mysql-left-join.aspx/
 
Ad Fundum

Ad Fundum

11/04/2021 19:54:14
Quote Anchor link
Je hebt o2 en o3 inderdaad niet gekoppeld.
Als o3 de scores als invaller geeft, en o2 de totalen, dan helpt het om voor "ORDER BY o3.aantal DESC", deze regel op te nemen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
WHERE o2.persid = o3.persid

Dan wordt de JOIN tussen o2 en o3 een INNER JOIN waarbij de scores op één rij komen te staan.
En in o2 moet er net als bij o3 ook een GROUP BY komen op opstelere.persid.
De query wordt dan:
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
SELECT
  o2.gesc,
  o3.aantal,
  p.persid,
  p.voornaam,
  p.tussenvoegsel,
  p.achternaam
FROM
  ( SELECT
      o.persid,
      SUM(o.gesc) AS gesc
    FROM opstelere o
    WHERE o.gesc > 0
    GROUP BY o.persid
   ) AS o2,
   ( SELECT
       o.persid,
       SUM(o.gesc) AS aantal
     FROM opstelere o
     WHERE o.gesc > 0
       AND (
         (o.volgorde > 11 AND o.volgorde < 21
       ) OR (
         o.volgorde > 31 AND o.volgorde < 39)
       )
     GROUP BY o.persid
   ) AS o3
   JOIN personen AS p
     ON p.persid = o3.persid
WHERE o2.persid = o3.persid
ORDER BY o3.aantal DESC
Gewijzigd op 11/04/2021 20:11:13 door Ad Fundum
 
Jan van Veen

Jan van Veen

11/04/2021 21:46:41
Quote Anchor link
Dank je Ad Fundum. Dit zocht ik!
 
Ad Fundum

Ad Fundum

12/04/2021 10:25:08
Quote Anchor link
In dat geval kan de query korter.
Nu harkt de database twee keer door de tabel opstelere, en het resultaat wordt zonder index gekoppeld.
Qua prestaties maakt dat niet veel uit als de tabellen klein zijn, maar het kan simpeler, ook voor de database:
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
SELECT
  SUM(opstelere.gesc) AS gesc,
  SUM(CASE
    WHEN opstelere.volgorde BETWEEN 12 AND 20
      OR opstelere.volgorde BETWEEN 32 AND 38
    THEN opstelere.gesc
    ELSE 0
  END) AS aantal,
  personen.persid,
  personen.voornaam,
  personen.tussenvoegsel,
  personen.achternaam
FROM opstelere
  JOIN personen ON personen.persid = opstelere.persid
WHERE opstelere.gesc > 0
GROUP BY opstelere.persid
ORDER BY aantal DESC

Overigens werkt deze query niet voor Postgres, omdat de ORDER BY niet direct werkt voor een berekende kolom.
Voor MySQL/MariaDB geeft het geen problemen.
Gewijzigd op 12/04/2021 10:25:44 door Ad Fundum
 
Jan van Veen

Jan van Veen

12/04/2021 21:09:26
Quote Anchor link
Bedankt weer. Deze query geeft hetzelfde resultaat ;-) maar lijkt iets langzamer.
Ter indicatie. Tabel bestaat nu uit bijna 400000 records en geeft 1367 rijden als resultaat.
Ben echt blij met de hulp in deze. Top! Ik kan weer verder.
 



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.