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.
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
@"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/
?
Onbekende gebruiker
11-04-2021 19:54
gewijzigd op 11-04-2021 20:11
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:
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:
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
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:
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.
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.