Query aanpassen
Hallo,
Ik heb een werkende query namelijk:
Nu telt deze query per team uit hoeveel goals een persoon gemaakt heeft (ook als deze goals heeft gemaakt in een ander team telt hij deze mee)
Wat ik nu graag zou willen is dat hij per persoon uittelt hoe vaak hij per team gescoord heeft.
Dus wat ik nu krijg:
Jantje - 3 goals A1 (1x in A1 , 2x in B1)
Pietje - 3 goals A1 (3x in A1)
----------
Klaasje - 1 goal B1
Wat ik dus zou willen:
Pietje - 3 goals A1
Jantje - 1 goal A1
----------
Jantje - 2 goals B1
Klaasje - 1 goal B1
Hoe kan ik deze query aanpassen dat hij dus de goals per persoon per team telt.
Ik heb zelf al vanalles geprobeerd maar zie het helaas niet meer.
Hoop dat het een beetje duidelijk is.
Alvast bedankt!
Ik heb een werkende query namelijk:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
SELECT
lid.voornaam,
lid.achternaam,
lid.teams,
lid.id,
COUNT(g.leden_id) aantal_goals
FROM
(SELECT
l.id,
l.voornaam,
l.achternaam,
t.team AS teams
FROM
Leden AS l
JOIN
Teamindeling AS ti
ON
(l.id = ti.leden_id)
JOIN
Teams AS t
ON
(t.id = ti.team_id)
WHERE
ti.taak = 'Speler'
AND
ti.seizoen = '2013/2014'
AND
t.leeftijd = 'Junioren'
GROUP BY
l.id,
l.voornaam,
l.achternaam
) AS lid
LEFT JOIN
Goals AS g
ON
(lid.id = g.leden_id) AND g.seizoen = '". $seizoen. "' AND g.wie LIKE 'ZSC%'
LEFT JOIN
Wedstrijden AS w
ON
(g.wedstrijd_id = w.id)
WHERE
w.soort = 'Competitie'
GROUP BY
lid.voornaam,
lid.achternaam,
lid.teams
ORDER BY
lid.teams,
aantal_goals DESC
lid.voornaam,
lid.achternaam,
lid.teams,
lid.id,
COUNT(g.leden_id) aantal_goals
FROM
(SELECT
l.id,
l.voornaam,
l.achternaam,
t.team AS teams
FROM
Leden AS l
JOIN
Teamindeling AS ti
ON
(l.id = ti.leden_id)
JOIN
Teams AS t
ON
(t.id = ti.team_id)
WHERE
ti.taak = 'Speler'
AND
ti.seizoen = '2013/2014'
AND
t.leeftijd = 'Junioren'
GROUP BY
l.id,
l.voornaam,
l.achternaam
) AS lid
LEFT JOIN
Goals AS g
ON
(lid.id = g.leden_id) AND g.seizoen = '". $seizoen. "' AND g.wie LIKE 'ZSC%'
LEFT JOIN
Wedstrijden AS w
ON
(g.wedstrijd_id = w.id)
WHERE
w.soort = 'Competitie'
GROUP BY
lid.voornaam,
lid.achternaam,
lid.teams
ORDER BY
lid.teams,
aantal_goals DESC
Nu telt deze query per team uit hoeveel goals een persoon gemaakt heeft (ook als deze goals heeft gemaakt in een ander team telt hij deze mee)
Wat ik nu graag zou willen is dat hij per persoon uittelt hoe vaak hij per team gescoord heeft.
Dus wat ik nu krijg:
Jantje - 3 goals A1 (1x in A1 , 2x in B1)
Pietje - 3 goals A1 (3x in A1)
----------
Klaasje - 1 goal B1
Wat ik dus zou willen:
Pietje - 3 goals A1
Jantje - 1 goal A1
----------
Jantje - 2 goals B1
Klaasje - 1 goal B1
Hoe kan ik deze query aanpassen dat hij dus de goals per persoon per team telt.
Ik heb zelf al vanalles geprobeerd maar zie het helaas niet meer.
Hoop dat het een beetje duidelijk is.
Alvast bedankt!
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
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
SELECT
t.team,
l.voornaam,
l.achternaam,
COUNT(g.leden_d) AS aantal_goals
FROM
teams t
JOIN
team_indeling ti
ON t.id = team_id
JOIN
leden l
ON ti.leden_id = l.id
LEFT JOIN
goals g
ON l.id = g.leden_id AND g.seizoen = '2013/2014' AND g.wie LIKE 'ZSC%'
LEFT JOIN
wedstrijden w
ON g.wedstrijd_id = w.id AND w.soort = 'Competitie'
WHERE
ti.taak = 'Speler'
AND ti.seizoen = '2013/2014'
AND t.leeftijd = 'Junioren'
GROUP BY
t.team,
l.voornaam,
l.achternaam
ORDER BY
t.team, aantal_goals DESC
t.team,
l.voornaam,
l.achternaam,
COUNT(g.leden_d) AS aantal_goals
FROM
teams t
JOIN
team_indeling ti
ON t.id = team_id
JOIN
leden l
ON ti.leden_id = l.id
LEFT JOIN
goals g
ON l.id = g.leden_id AND g.seizoen = '2013/2014' AND g.wie LIKE 'ZSC%'
LEFT JOIN
wedstrijden w
ON g.wedstrijd_id = w.id AND w.soort = 'Competitie'
WHERE
ti.taak = 'Speler'
AND ti.seizoen = '2013/2014'
AND t.leeftijd = 'Junioren'
GROUP BY
t.team,
l.voornaam,
l.achternaam
ORDER BY
t.team, aantal_goals DESC
Hallo Ger,
Bedankt alvast voor het meedenken. Helaas werkt het nog niet helemaal.
Voorbeeld: http://www.zscwesterhoven.nl/test.php?o=1
Ik zal proberen mijn databasestructuur nog wat verder uit te leggen, dan komen we er hopelijk wel uit.
Leden -
id 1
voornaam Jan
achternaam Test
Wedstrijden
id 1
team_1 ZSC C1
team_2 TEST C1
soort Competitie
competitie ZSC C1
seizoen 2013/2014
Goals
id 1
wedstrijd_id 1
leden_id 1
wie ZSC C1
minuut 10
seizoen 2013/2014
Teams
id 1
team ZSC C1
volgorde 2
seizoen 2013/2014
leeftijd Junioren
Teamindeling
id 1
team_id 1
leden_id 1
taak Speler
seizoen 2013/2014
Query:
Toevoeging op 16/05/2014 17:14:23:
De bovenste persoon van de B1 bijvoorbeeld had in de B1 9 doelpunten moeten hebben, en hoort ook in het rijtje A1 thuis, met 2 doelpunten.
Hier nog een plaatje als ik in kolom Goals kijk voor deze persoon:
http://www.zscwesterhoven.nl/uitlegplaatje.jpg
Bedankt alvast voor het meedenken. Helaas werkt het nog niet helemaal.
Voorbeeld: http://www.zscwesterhoven.nl/test.php?o=1
Ik zal proberen mijn databasestructuur nog wat verder uit te leggen, dan komen we er hopelijk wel uit.
Leden -
id 1
voornaam Jan
achternaam Test
Wedstrijden
id 1
team_1 ZSC C1
team_2 TEST C1
soort Competitie
competitie ZSC C1
seizoen 2013/2014
Goals
id 1
wedstrijd_id 1
leden_id 1
wie ZSC C1
minuut 10
seizoen 2013/2014
Teams
id 1
team ZSC C1
volgorde 2
seizoen 2013/2014
leeftijd Junioren
Teamindeling
id 1
team_id 1
leden_id 1
taak Speler
seizoen 2013/2014
Query:
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
36
37
38
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
36
37
38
$query = "
SELECT
t.team,
l.voornaam,
l.achternaam,
COUNT(g.leden_id) AS aantal_goals
FROM
Teams t
JOIN
Teamindeling ti
ON
t.id = team_id
JOIN
Leden l
ON
ti.leden_id = l.id
LEFT JOIN
Goals g
ON
l.id = g.leden_id AND g.seizoen = '". $seizoen. "' AND g.wie LIKE 'ZSC%'
LEFT JOIN
Wedstrijden w
ON
g.wedstrijd_id = w.id AND w.soort = 'Competitie'
WHERE
ti.taak = 'Speler'
AND
ti.seizoen = '". $seizoen. "'
AND
t.leeftijd = 'Junioren'
GROUP BY
t.team,
l.voornaam,
l.achternaam
ORDER BY
t.team,
aantal_goals DESC
";
SELECT
t.team,
l.voornaam,
l.achternaam,
COUNT(g.leden_id) AS aantal_goals
FROM
Teams t
JOIN
Teamindeling ti
ON
t.id = team_id
JOIN
Leden l
ON
ti.leden_id = l.id
LEFT JOIN
Goals g
ON
l.id = g.leden_id AND g.seizoen = '". $seizoen. "' AND g.wie LIKE 'ZSC%'
LEFT JOIN
Wedstrijden w
ON
g.wedstrijd_id = w.id AND w.soort = 'Competitie'
WHERE
ti.taak = 'Speler'
AND
ti.seizoen = '". $seizoen. "'
AND
t.leeftijd = 'Junioren'
GROUP BY
t.team,
l.voornaam,
l.achternaam
ORDER BY
t.team,
aantal_goals DESC
";
Toevoeging op 16/05/2014 17:14:23:
De bovenste persoon van de B1 bijvoorbeeld had in de B1 9 doelpunten moeten hebben, en hoort ook in het rijtje A1 thuis, met 2 doelpunten.
Hier nog een plaatje als ik in kolom Goals kijk voor deze persoon:
http://www.zscwesterhoven.nl/uitlegplaatje.jpg
Dat het aantal doelpunten niet klopt, kan ik wel thuisbrengen, maar dat maar iemand maar bij één team wordt weergegeven niet.
In ieder geval moet je bij de join van de goals LIKE 'ZSC%' veranderen in g.wie = t.team
In ieder geval moet je bij de join van de goals LIKE 'ZSC%' veranderen in g.wie = t.team
Hallo Ger,
Allereerst weer bedankt voor je hulp. Nu ik dit veranderd heb kloppen het aantal goals wel. Helaas zie ik de namen nog steeds maar bij 1 team, wat kan ik je nog aan extra info@ geven zodat we ook daar uit kunnen komen?
Als laatste nog: Er bestaat bij die Goals tabel ook een leden_id 0, dit is een eigen doelpunt, omdat er geen Lid 0 bestaat komen deze volgens mij dus ook niet in de lijst. Is het mogelijk om daar toch Eigen goals - Aantal te krijgen?
Groetjes!
Toevoeging op 17/05/2014 09:06:49:
Kan het misschien zo zijn dat hij de speler niet bij de andere teams laat zien omdat de speler niet in de teamindeling van dat elftal staat?
Allereerst weer bedankt voor je hulp. Nu ik dit veranderd heb kloppen het aantal goals wel. Helaas zie ik de namen nog steeds maar bij 1 team, wat kan ik je nog aan extra info@ geven zodat we ook daar uit kunnen komen?
Als laatste nog: Er bestaat bij die Goals tabel ook een leden_id 0, dit is een eigen doelpunt, omdat er geen Lid 0 bestaat komen deze volgens mij dus ook niet in de lijst. Is het mogelijk om daar toch Eigen goals - Aantal te krijgen?
Groetjes!
Toevoeging op 17/05/2014 09:06:49:
Kan het misschien zo zijn dat hij de speler niet bij de andere teams laat zien omdat de speler niet in de teamindeling van dat elftal staat?
Als een speler niet bij de teamindeling van een team staat wordt die niet meegenomen in deze query.
Als het goed is in deze wel:
Als het goed is in deze wel:
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
36
37
38
39
40
41
42
43
44
45
46
47
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
36
37
38
39
40
41
42
43
44
45
46
47
SELECT
t.team,
l.voornaam,
l.achternaam,
COUNT(g.leden_id) AS aantal_goals
FROM
teams t
JOIN
(SELECT
team_id,
leden_id,
FROM
team_indeling
WHERE
seizoen = '2013/2014'
AND
taak = 'Speler'
UNION
SELECT DISTINCT
tt.team_id
go.leden_id
FROM
goals go
JOIN
teams tt
ON go.wie = tt.team
WHERE
tt.leeftijd = 'Junioren' AND go.seizoen = '2013/2014'
) ti
ON t.id = ti.team_id
JOIN
leden l
ON ti.leden_id = l.id AND
LEFT JOIN
goals g
ON l.id = g.leden_id AND g.seizoen = '2013/2014' AND g.wie = t.team
LEFT JOIN
wedstrijden w
ON g.wedstrijd_id = w.id AND w.soort = 'Competitie'
WHERE
t.leeftijd = 'Junioren'
GROUP BY
t.team,
l.voornaam,
l.achternaam
ORDER BY
t.team, aantal_goals DESC
t.team,
l.voornaam,
l.achternaam,
COUNT(g.leden_id) AS aantal_goals
FROM
teams t
JOIN
(SELECT
team_id,
leden_id,
FROM
team_indeling
WHERE
seizoen = '2013/2014'
AND
taak = 'Speler'
UNION
SELECT DISTINCT
tt.team_id
go.leden_id
FROM
goals go
JOIN
teams tt
ON go.wie = tt.team
WHERE
tt.leeftijd = 'Junioren' AND go.seizoen = '2013/2014'
) ti
ON t.id = ti.team_id
JOIN
leden l
ON ti.leden_id = l.id AND
LEFT JOIN
goals g
ON l.id = g.leden_id AND g.seizoen = '2013/2014' AND g.wie = t.team
LEFT JOIN
wedstrijden w
ON g.wedstrijd_id = w.id AND w.soort = 'Competitie'
WHERE
t.leeftijd = 'Junioren'
GROUP BY
t.team,
l.voornaam,
l.achternaam
ORDER BY
t.team, aantal_goals DESC
Ik ga maandag even kijken of dit werkt.
Nu een weekendje weg.
Bedankt iniedergeval!
Nu een weekendje weg.
Bedankt iniedergeval!
>> Ik ga maandag even kijken of dit werkt
Foei!! :-P
D B in PM:
Ik heb deze namelijk van het weekend nodig voor onze jaarlijkse afsluiting. (Wil geen druk bij je neerleggen hoor)
Foei!! :-P
Gewijzigd op 17/05/2014 17:14:54 door Ger van Steenderen
De oplossing in je vorige post was genoeg voor dit weekend omdat ze op de club alleen de topscoorders van junioren (1x) en pupillen (1x) nodig hadden om de wisselbeker te laten maken. Volgend weekend word er van elk team de top 3 opgenoemd en dat ligt allemaal korter bij elkaar dus dan heb ik de nog gespecificeerdere oplossing nodig.
Zodoende. Maandag ga ik dus zelf ook meteen weer aan de slag.
Zodoende. Maandag ga ik dus zelf ook meteen weer aan de slag.
Geniet van je weekend ;-)
Hallo,
Daar ben ik weer.
Ik heb nu de query van je gebruikt Ger, maar tt.team_id bestaat niet dus daar kan hij niets mee. Ik snap helaas zelf niet wat de query precies doet met die UNION enzo, dus weet niet zo goed wat ik nu kan wijzigen. Kan ik op een makkelijke manier mijn database opbouw laten zien zodat je er misschien meer wijs uit kunt?
Groeten,
Danny
Daar ben ik weer.
Ik heb nu de query van je gebruikt Ger, maar tt.team_id bestaat niet dus daar kan hij niets mee. Ik snap helaas zelf niet wat de query precies doet met die UNION enzo, dus weet niet zo goed wat ik nu kan wijzigen. Kan ik op een makkelijke manier mijn database opbouw laten zien zodat je er misschien meer wijs uit kunt?
Groeten,
Danny
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
36
37
38
39
40
41
42
43
44
45
46
47
48
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
36
37
38
39
40
41
42
43
44
45
46
47
48
SELECT
t.team,
l.voornaam,
l.achternaam,
COUNT(g.leden_id) AS aantal_goals
FROM
Teams t
JOIN
(SELECT
team_id,
leden_id
FROM
Teamindeling
WHERE
seizoen = '2013/2014'
AND
taak = 'Speler'
UNION
SELECT DISTINCT
tt.team_id,
go.leden_id
FROM
Goals go
JOIN
Teams tt
ON go.wie = tt.team
WHERE
tt.leeftijd = 'Junioren' AND go.seizoen = '2013/2014'
) ti
ON t.id = ti.team_id
JOIN
Leden l
ON ti.leden_id = l.id
LEFT JOIN
Goals g
ON l.id = g.leden_id AND g.seizoen = '2013/2014' AND g.wie = t.team
LEFT JOIN
Wedstrijden w
ON g.wedstrijd_id = w.id AND w.soort = 'Competitie'
WHERE
t.leeftijd = 'Junioren'
GROUP BY
t.team,
l.voornaam,
l.achternaam
ORDER BY
t.team,
aantal_goals DESC
t.team,
l.voornaam,
l.achternaam,
COUNT(g.leden_id) AS aantal_goals
FROM
Teams t
JOIN
(SELECT
team_id,
leden_id
FROM
Teamindeling
WHERE
seizoen = '2013/2014'
AND
taak = 'Speler'
UNION
SELECT DISTINCT
tt.team_id,
go.leden_id
FROM
Goals go
JOIN
Teams tt
ON go.wie = tt.team
WHERE
tt.leeftijd = 'Junioren' AND go.seizoen = '2013/2014'
) ti
ON t.id = ti.team_id
JOIN
Leden l
ON ti.leden_id = l.id
LEFT JOIN
Goals g
ON l.id = g.leden_id AND g.seizoen = '2013/2014' AND g.wie = t.team
LEFT JOIN
Wedstrijden w
ON g.wedstrijd_id = w.id AND w.soort = 'Competitie'
WHERE
t.leeftijd = 'Junioren'
GROUP BY
t.team,
l.voornaam,
l.achternaam
ORDER BY
t.team,
aantal_goals DESC
Daar ben ik weer,
Na flink puzzelen heb ik het volgende:
http://www.zscwesterhoven.nl/test.php?o=2
http://www.zscwesterhoven.nl/uitlegplaatje.jpg
Zoals op het plaatje te zien krijg ik nu de teams waar ze gescoord hebben en de teams waar ze in spelen te zien. Nu zouden ze alleen nog gecount moeten worden (per t.team) en gegroepeerd worden.
Wie kan me hiermee helpen?
Na flink puzzelen heb ik het volgende:
http://www.zscwesterhoven.nl/test.php?o=2
http://www.zscwesterhoven.nl/uitlegplaatje.jpg
Zoals op het plaatje te zien krijg ik nu de teams waar ze gescoord hebben en de teams waar ze in spelen te zien. Nu zouden ze alleen nog gecount moeten worden (per t.team) en gegroepeerd worden.
Wie kan me hiermee helpen?
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
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
SELECT
l.voornaam,
l.achternaam,
g.wie,
g.leden_id,
t.team
FROM
Goals AS g
LEFT JOIN
Leden AS l
ON
g.leden_id = l.id
LEFT JOIN
Wedstrijden AS w
ON
g.wedstrijd_id = w.id
LEFT JOIN
Teamindeling AS ti
ON
g.leden_id = ti.leden_id AND ti.taak = 'Speler' AND ti.seizoen = '2013/2014'
LEFT JOIN
Teams AS t
ON
ti.team_id = t.id
WHERE
g.seizoen = '2013/2014'
AND
w.soort = 'Competitie'
AND
g.wie LIKE 'ZSC%'
AND
t.leeftijd = 'Junioren'
l.voornaam,
l.achternaam,
g.wie,
g.leden_id,
t.team
FROM
Goals AS g
LEFT JOIN
Leden AS l
ON
g.leden_id = l.id
LEFT JOIN
Wedstrijden AS w
ON
g.wedstrijd_id = w.id
LEFT JOIN
Teamindeling AS ti
ON
g.leden_id = ti.leden_id AND ti.taak = 'Speler' AND ti.seizoen = '2013/2014'
LEFT JOIN
Teams AS t
ON
ti.team_id = t.id
WHERE
g.seizoen = '2013/2014'
AND
w.soort = 'Competitie'
AND
g.wie LIKE 'ZSC%'
AND
t.leeftijd = 'Junioren'
Heb je de query die ik gaf al uit geprobeerd?
Jazeker, zie 2à3 posts terug, over die union en de tt id die niet bestaat.
Gewijzigd op 20/05/2014 19:45:48 door D B
Altijd wel even contoleren op veldnamen, ik heb de gewoonte om een id kolom de enkelvoudige naam van de tabel mee te geven (i.e. in teams -> team_id).
UNION is de resultaten van twee query's samenvatten, dus wat ik doe in subquery is eerst de spelers selecteren bij het team waarin ze zijn ingedeeld, en daarna pak ik het de teams erbij waarvoor ze ook zijn uitgekomen vanuit de goals tabel.
Als je aan dingen twijfelt moet je gewoon zo'n subquery los uit proberen in jouw favoriete SQL tool
UNION is de resultaten van twee query's samenvatten, dus wat ik doe in subquery is eerst de spelers selecteren bij het team waarin ze zijn ingedeeld, en daarna pak ik het de teams erbij waarvoor ze ook zijn uitgekomen vanuit de goals tabel.
Als je aan dingen twijfelt moet je gewoon zo'n subquery los uit proberen in jouw favoriete SQL tool
Gewijzigd op 20/05/2014 20:01:49 door Ger van Steenderen
Zo was ik dus inderdaad tot mijn laatste post gekomen.
Ik ga nu die query van jou nog eens proberen.
Toevoeging op 20/05/2014 20:29:39:
Ik gebruik nu dit:
Maar dit geeft niet het gewenste resultaat.
Zie http://www.zscwesterhoven.nl/test.php?o=1
Linkse kolom = Goede aantal goals, zonder spelers uit andere teams
Rechtse kolom = Spelers uit andere teams erbij, aantallen niet goed
Ergens telt hij nu te veel goals. En ook zie ik graag achter de naam het Team uit de teamindeling, en niet het team waar de goals in zijn gemaakt. Dit heeft denk ik te maken met select t.team bovenaan in de query.
(Het lijkt erop dat alles x3 en/of x2 is gedaan)
Ik ga nu die query van jou nog eens proberen.
Toevoeging op 20/05/2014 20:29:39:
Ik gebruik nu dit:
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
36
37
38
39
40
41
42
43
44
45
46
47
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
36
37
38
39
40
41
42
43
44
45
46
47
SELECT
t.team,
l.voornaam,
l.achternaam,
COUNT(g.leden_id) AS aantal_goals
FROM
Teams t
JOIN
(SELECT
team_id,
leden_id
FROM
Teamindeling
WHERE
seizoen = '2013/2014'
AND
taak = 'Speler'
UNION
SELECT DISTINCT
tt.id,
go.leden_id
FROM
Goals go
JOIN
Teams tt
ON go.wie = tt.team
WHERE
tt.leeftijd = 'Junioren' AND go.seizoen = '2013/2014'
) ti
ON t.id = ti.team_id
JOIN
Leden l
ON ti.leden_id = l.id
LEFT JOIN
Goals g
ON l.id = g.leden_id AND g.seizoen = '2013/2014' AND g.wie = t.team
LEFT JOIN
Wedstrijden w
ON g.wedstrijd_id = w.id AND w.soort = 'Competitie'
WHERE
t.leeftijd = 'Junioren'
GROUP BY
t.team,
l.voornaam,
l.achternaam
ORDER BY
t.team, aantal_goals DESC
t.team,
l.voornaam,
l.achternaam,
COUNT(g.leden_id) AS aantal_goals
FROM
Teams t
JOIN
(SELECT
team_id,
leden_id
FROM
Teamindeling
WHERE
seizoen = '2013/2014'
AND
taak = 'Speler'
UNION
SELECT DISTINCT
tt.id,
go.leden_id
FROM
Goals go
JOIN
Teams tt
ON go.wie = tt.team
WHERE
tt.leeftijd = 'Junioren' AND go.seizoen = '2013/2014'
) ti
ON t.id = ti.team_id
JOIN
Leden l
ON ti.leden_id = l.id
LEFT JOIN
Goals g
ON l.id = g.leden_id AND g.seizoen = '2013/2014' AND g.wie = t.team
LEFT JOIN
Wedstrijden w
ON g.wedstrijd_id = w.id AND w.soort = 'Competitie'
WHERE
t.leeftijd = 'Junioren'
GROUP BY
t.team,
l.voornaam,
l.achternaam
ORDER BY
t.team, aantal_goals DESC
Maar dit geeft niet het gewenste resultaat.
Zie http://www.zscwesterhoven.nl/test.php?o=1
Linkse kolom = Goede aantal goals, zonder spelers uit andere teams
Rechtse kolom = Spelers uit andere teams erbij, aantallen niet goed
Ergens telt hij nu te veel goals. En ook zie ik graag achter de naam het Team uit de teamindeling, en niet het team waar de goals in zijn gemaakt. Dit heeft denk ik te maken met select t.team bovenaan in de query.
(Het lijkt erop dat alles x3 en/of x2 is gedaan)
Gewijzigd op 20/05/2014 20:41:43 door D B
>> Als je aan dingen twijfelt moet je gewoon zo'n subquery los uit proberen in jouw favoriete SQL tool
Als dingen niet werken zoals je verwacht, moet je de query gaan debuggen, en dat betekent stukje voor stukje opbouwen.
Ik kan niet in jouw database gegevens kijken, dus kan (en wil) het ook niet uittesten.
Klinkt misschien een beetje bot, maar zo heb ik het ook geleerd.
Als dingen niet werken zoals je verwacht, moet je de query gaan debuggen, en dat betekent stukje voor stukje opbouwen.
Ik kan niet in jouw database gegevens kijken, dus kan (en wil) het ook niet uittesten.
Klinkt misschien een beetje bot, maar zo heb ik het ook geleerd.
Uiteindelijk is het dan volgens mij toch gelukt en is het volgende de oplossing geweest:
Ger, iniedergeval bedankt voor het helpen!
Misschien heb je nog wat tips/opmerkingen over dit scriptje?
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
elseif ($_GET['o'] == "2") {
$query1 = "
SELECT
team
FROM
Teams
WHERE
seizoen = '". $seizoen. "'
AND
leeftijd = 'Junioren'
";
$res1=mysql_query($query1) or die(mysql_error());
echo '<table class="buiten" style="border:1px solid black;">';
echo '<tr><th colspan="4">Topscoorders Junioren - Per Team</th></tr>';
while ($row1 = mysql_fetch_array($res1)) {
echo '<tr><th colspan="4">'. $row1['team']. '</td></tr>';
$query = "
SELECT
l.voornaam,
l.achternaam,
g.wie,
COUNT(g.leden_id) AS aantal_goals,
t.team
FROM
Goals AS g
LEFT JOIN
Leden AS l
ON
g.leden_id = l.id
LEFT JOIN
Wedstrijden AS w
ON
g.wedstrijd_id = w.id
LEFT JOIN
Teamindeling AS ti
ON
g.leden_id = ti.leden_id AND ti.taak = 'Speler' AND ti.seizoen = '". $seizoen. "'
LEFT JOIN
Teams AS t
ON
ti.team_id = t.id
WHERE
g.seizoen = '". $seizoen. "'
AND
w.soort = 'Competitie'
AND
g.wie = '". $row1['team']. "'
AND
t.leeftijd = 'Junioren'
GROUP BY
g.leden_id,g.wie
ORDER BY
g.wie,
aantal_goals DESC,
l.achternaam
";
$res=mysql_query($query) or die(mysql_error());
while ($row=mysql_fetch_array($res)){
echo '<tr>';
echo '<td align="left" width="80">'. $row['voornaam']. '</td>';
echo '<td align="left" width="120">'. $row['achternaam']. '</td>';
echo '<td align="left" width="100">'. $row['team']. '</td>';
echo '<td align="right" width="50">'. $row['aantal_goals']. '</td>';
echo '</tr>';
}
$query2 = "SELECT COUNT(g.leden_id) AS aantal_goals FROM Goals AS g LEFT JOIN Wedstrijden AS w ON g.wedstrijd_id = w.id WHERE g.wie = '". $row1['team']. "' AND g.leden_id = '0' AND w.soort = 'Competitie' AND w.seizoen = '". $seizoen. "'";
$res2=mysql_query($query2) or die(mysql_error());
$row2=mysql_fetch_array($res2);
echo '<tr>';
echo '<td align="left" colspan="3">Eigen goals door Tegenstander</td>';
echo '<td align="right" width="100">'. $row2['aantal_goals']. '</td>';
echo '</tr>';
echo '<tr><th colspan="4">'. $row['wie']. '</td></tr>';
}
echo '</td>';
echo '</tr>';
echo '</table>';
}
$query1 = "
SELECT
team
FROM
Teams
WHERE
seizoen = '". $seizoen. "'
AND
leeftijd = 'Junioren'
";
$res1=mysql_query($query1) or die(mysql_error());
echo '<table class="buiten" style="border:1px solid black;">';
echo '<tr><th colspan="4">Topscoorders Junioren - Per Team</th></tr>';
while ($row1 = mysql_fetch_array($res1)) {
echo '<tr><th colspan="4">'. $row1['team']. '</td></tr>';
$query = "
SELECT
l.voornaam,
l.achternaam,
g.wie,
COUNT(g.leden_id) AS aantal_goals,
t.team
FROM
Goals AS g
LEFT JOIN
Leden AS l
ON
g.leden_id = l.id
LEFT JOIN
Wedstrijden AS w
ON
g.wedstrijd_id = w.id
LEFT JOIN
Teamindeling AS ti
ON
g.leden_id = ti.leden_id AND ti.taak = 'Speler' AND ti.seizoen = '". $seizoen. "'
LEFT JOIN
Teams AS t
ON
ti.team_id = t.id
WHERE
g.seizoen = '". $seizoen. "'
AND
w.soort = 'Competitie'
AND
g.wie = '". $row1['team']. "'
AND
t.leeftijd = 'Junioren'
GROUP BY
g.leden_id,g.wie
ORDER BY
g.wie,
aantal_goals DESC,
l.achternaam
";
$res=mysql_query($query) or die(mysql_error());
while ($row=mysql_fetch_array($res)){
echo '<tr>';
echo '<td align="left" width="80">'. $row['voornaam']. '</td>';
echo '<td align="left" width="120">'. $row['achternaam']. '</td>';
echo '<td align="left" width="100">'. $row['team']. '</td>';
echo '<td align="right" width="50">'. $row['aantal_goals']. '</td>';
echo '</tr>';
}
$query2 = "SELECT COUNT(g.leden_id) AS aantal_goals FROM Goals AS g LEFT JOIN Wedstrijden AS w ON g.wedstrijd_id = w.id WHERE g.wie = '". $row1['team']. "' AND g.leden_id = '0' AND w.soort = 'Competitie' AND w.seizoen = '". $seizoen. "'";
$res2=mysql_query($query2) or die(mysql_error());
$row2=mysql_fetch_array($res2);
echo '<tr>';
echo '<td align="left" colspan="3">Eigen goals door Tegenstander</td>';
echo '<td align="right" width="100">'. $row2['aantal_goals']. '</td>';
echo '</tr>';
echo '<tr><th colspan="4">'. $row['wie']. '</td></tr>';
}
echo '</td>';
echo '</tr>';
echo '</table>';
}
Ger, iniedergeval bedankt voor het helpen!
Misschien heb je nog wat tips/opmerkingen over dit scriptje?
Gewijzigd op 21/05/2014 00:10:09 door D B
>>Als ik alleen die SELECT met UNION query gebruik komt daar 3x team_id (32,6,55) naar voren met 3x leden_id 167
Dat is precies de bedoeling, de subquery is bedoeld om een virtuele teamindeling te genereren.
Je moet alleen tt.team meenemen in de SELECT meenemen, en daar de goals tabel op joinen.
Als je het team erbij wilt waar een speler oorspronkelijk is ingedeeld, moet je de teamindeling nogmaals joinen (na leden)
Dat is precies de bedoeling, de subquery is bedoeld om een virtuele teamindeling te genereren.
Je moet alleen tt.team meenemen in de SELECT meenemen, en daar de goals tabel op joinen.
Als je het team erbij wilt waar een speler oorspronkelijk is ingedeeld, moet je de teamindeling nogmaals joinen (na leden)
Ik heb het nu iniedergeval werkend, maar ik ga nog zeker eens naar jou query met laatstgenoemde tips kijken.
Met jouw query krijg je alleen spelers te zien die gescoord hebben.
Met mijn query krijg je altijd alle spelers te zien die bij een team zijn ingedeeld.
Wil je dan toch alleen maar de spelers zien die gescoord hebben voeg je een having clause aan de group by toe.
Daarnaast is de goals tabel de meest uitgebreide tabel, dus dat scheelt een hele hoop performance.
Met mijn query krijg je altijd alle spelers te zien die bij een team zijn ingedeeld.
Wil je dan toch alleen maar de spelers zien die gescoord hebben voeg je een having clause aan de group by toe.
Daarnaast is de goals tabel de meest uitgebreide tabel, dus dat scheelt een hele hoop performance.
Gewijzigd op 22/05/2014 15:34:58 door Ger van Steenderen




