Resultaat twee subquery's net niet volledig
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
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
Gewijzigd op 11/04/2021 09:13:48 door Jan R
@"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/
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:
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)
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
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
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
Dank je Ad Fundum. Dit zocht ik!
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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.
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.