Opgelost: MySQL haal niet alle resultaten op.
Bij het ophalen van de beoordelingen haalt hij alleen de eerste 10 beoordelingen op.
In de tabel staan echter per wedstrijd 13 spelers. Er missen dus nog 3 spelers. Ik gebruik onderstaande query
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT sp.naam,
AVG( be.beoordeling ) AS beoordeling
FROM beoordeling AS be,
spelers AS sp,
opstelling AS op
WHERE be.wedstr_id = '".$_GET['wedid']."'
AND be.opstelling_id = op.id
AND op.speler_id = sp.id
GROUP BY sp.id
AVG( be.beoordeling ) AS beoordeling
FROM beoordeling AS be,
spelers AS sp,
opstelling AS op
WHERE be.wedstr_id = '".$_GET['wedid']."'
AND be.opstelling_id = op.id
AND op.speler_id = sp.id
GROUP BY sp.id
Ik gebruik de volgende tabellen:
Beoordelingen:
- id
- opstelling_id
- wedstr_id
- beoordeling
- crew_id
Opstelling
- id
- wedstr_id
- speler_id
Weet iemand hoe het kan dat er maar 10 resultaten worden opgehaald. Ook als ik de code rechtstreeks invoer bij PHPMyAdmin krijg ik maar 10 resultaten terug terwijl ik toch echt minimaal 13 resultaten per wedstrijd zie staan.
Alvast bedankt Remco
Gewijzigd op 01/01/1970 01:00:00 door Remco
Dan kloppen je JOINS niet. Tevens klopt je GROUP BY ook niet
Onderstaande is mijn nieuwe SQL-code
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT sp.naam, AVG( be.beoordeling ) AS beoordeling
FROM beoordeling AS be, spelers AS sp
WHERE be.wedstr_id = '".$id."'
AND op.id = be.opstelling_id
AND sp.id = op.speler_id
GROUP By be.opstelling_id
ORDER BY sp.positie_id
FROM beoordeling AS be, spelers AS sp
WHERE be.wedstr_id = '".$id."'
AND op.id = be.opstelling_id
AND sp.id = op.speler_id
GROUP By be.opstelling_id
ORDER BY sp.positie_id
Weet iemand ook hoe ik het anders kan doen of wat de reden is van het vage gedrag van PHPMyAdmin
het juiste gebruik van GROUP BY.
Verder gebruik je de kolom op.id, maar tenzij 'op' een tabelnaam is zie ik deze nergens terug komen in je query? Met andere woorden, er zal nooit aan deze voorwaarde voldaan worden en de query zal geen resultaat opleveren.
Tip: als je JOINs gebruikt (wat jij doet) schrijf ze dan volledig uit. Dat is ten eerste voor jezelf een stuk overzichtelijker en maakt daarnaast het debuggen een stuk eenvoudiger...
Om te beginnen klopt je GROUP BY nog steeds niet. In jouw query zou je moeten groeperen op sp.naam, maar jij doet dat om een of andere reden op be.opstelling_id? Lees hier eens meer over Verder gebruik je de kolom op.id, maar tenzij 'op' een tabelnaam is zie ik deze nergens terug komen in je query? Met andere woorden, er zal nooit aan deze voorwaarde voldaan worden en de query zal geen resultaat opleveren.
Tip: als je JOINs gebruikt (wat jij doet) schrijf ze dan volledig uit. Dat is ten eerste voor jezelf een stuk overzichtelijker en maakt daarnaast het debuggen een stuk eenvoudiger...
Waar komt op.id vandaan?
Dit is hem zoals hij was:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT sp.naam, AVG(be.beoordeling) AS beoordeling
FROM beoordeling AS be, spelers AS sp, opstelling AS op
WHERE be.wedstr_id = '121'
AND op.id = be.opstelling_id
AND sp.id = op.speler_id
GROUP By be.opstelling_id
ORDER BY sp.positie_id
FROM beoordeling AS be, spelers AS sp, opstelling AS op
WHERE be.wedstr_id = '121'
AND op.id = be.opstelling_id
AND sp.id = op.speler_id
GROUP By be.opstelling_id
ORDER BY sp.positie_id
De tabellen
Beoordelingen:
- id
- opstelling_id
- wedstr_id
- beoordeling
- crew_id
Opstelling
- id
- wedstr_id
- speler_id
Spelers
- id
- naam
(rest van deze tabel is niet erg belangrijk)
De code zou dus zou moeten zijn:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT sp.naam, AVG(be.beoordeling) AS beoordeling
FROM beoordeling AS be, spelers AS sp, opstelling AS op
WHERE be.wedstr_id = '121'
AND op.id = be.opstelling_id
AND sp.id = op.speler_id
GROUP By be.opstelling_id
ORDER BY sp.naam
FROM beoordeling AS be, spelers AS sp, opstelling AS op
WHERE be.wedstr_id = '121'
AND op.id = be.opstelling_id
AND sp.id = op.speler_id
GROUP By be.opstelling_id
ORDER BY sp.naam
Maar er gebeurt wederom niets.
Ik heb wel eens wat gelezen over JOINs en het volledig uitschrijven maar snapte ik niets van. Op deze manier lukt het me altijd wel maar nu nog even niet.
Waarom negeer je Blanche zijn opmerking over GROUP BY?
Heb het veranderd en ik krijg nu wel weer resultaten in PHPMyAdmin maar er verschijnen wederom maar 10 resultaten.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT sp.naam, AVG(be.beoordeling) AS beoordeling
FROM beoordeling AS be, spelers AS sp, opstelling AS op
WHERE be.wedstr_id = '91'
AND op.id = be.opstelling_id
AND sp.id = op.speler_id
GROUP BY sp.naam
ORDER BY sp.positie_id
FROM beoordeling AS be, spelers AS sp, opstelling AS op
WHERE be.wedstr_id = '91'
AND op.id = be.opstelling_id
AND sp.id = op.speler_id
GROUP BY sp.naam
ORDER BY sp.positie_id
Edit:
Ben er inmiddels wel achter dat het foutje aan mij ligt. Ik zal op 1 of andere manier de gegevens verkeerd ophalen maar ik zou niet weten hoe ik het anders zou moeten opstellen. Heb het al een aantal keren opnieuw opgeschreven maar kom steeds op deze code uit. Heeft iemand anders een idee
Ben er inmiddels wel achter dat het foutje aan mij ligt. Ik zal op 1 of andere manier de gegevens verkeerd ophalen maar ik zou niet weten hoe ik het anders zou moeten opstellen. Heb het al een aantal keren opnieuw opgeschreven maar kom steeds op deze code uit. Heeft iemand anders een idee
Gewijzigd op 01/01/1970 01:00:00 door remco
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
s.naam,
AVG(b.beoordeling) AS gem_beoordeling
FROM
spelers AS s
INNER JOIN
opstelling AS o
ON o.speler_id = s.id
INNER JOIN
beoordelingen AS b
ON b.opstelling_id = o.id
WHERE
o.wedstr_id = 121
GROUP BY
s.naam
ORDER BY
s.naam ASC
s.naam,
AVG(b.beoordeling) AS gem_beoordeling
FROM
spelers AS s
INNER JOIN
opstelling AS o
ON o.speler_id = s.id
INNER JOIN
beoordelingen AS b
ON b.opstelling_id = o.id
WHERE
o.wedstr_id = 121
GROUP BY
s.naam
ORDER BY
s.naam ASC
Verder snap ik niet waarom de kolom beoordelingen.wedstr_id bestaat, die informatie sla je namelijk ook al een keer op in de opstelling tabel dus kun je via beoordelingen.opstelling_id wel achterhalen.
Als deze query tenslotte ook maar 10 resultaten geeft, betekent dat er maar 10 spelers in de opstelling tabel aan de betreffende wedstrijd gekoppeld zijn en/of dat er voor die 10 spelers een beoordeling opgegeven is. Als er ook spelers zijn die geen beoordeling hebben, komen ze met deze query niet naar boven. Wil je dat wel, dan zul je de laatste INNER JOIN door een LEFT JOIN moeten vervangen...
Met de query hierboven krijg ik echter nog minder resultaten. Ik krijg nu nog maar 7 resultaten. Het zal dus vermoedelijk wel aan mijn tabel opbouw liggen.
Wat daar mis mee is zou ik echter niet weten.
Hieronder een aantal resultaten:
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
Opstelling:
id / wedstr_id / speler_id
15 121 3
16 121 4
17 121 7
18 121 8
19 121 9
20 121 14
21 121 16
22 121 18
23 121 19
24 121 21
25 121 28
Beoordeling:
id / opstelling_id / wedstr_id / beoordeling / crew_id
15 3 121 8 1
16 4 121 7 1
17 7 121 6 1
18 8 121 6 1
19 9 121 7 1
20 14 121 7 1
21 16 121 7 1
22 18 121 6 1
23 19 121 7 1
24 21 121 6 1
25 28 121 8 1
26 29 121 7 1
27 35 121 7 1
id / wedstr_id / speler_id
15 121 3
16 121 4
17 121 7
18 121 8
19 121 9
20 121 14
21 121 16
22 121 18
23 121 19
24 121 21
25 121 28
Beoordeling:
id / opstelling_id / wedstr_id / beoordeling / crew_id
15 3 121 8 1
16 4 121 7 1
17 7 121 6 1
18 8 121 6 1
19 9 121 7 1
20 14 121 7 1
21 16 121 7 1
22 18 121 6 1
23 19 121 7 1
24 21 121 6 1
25 28 121 8 1
26 29 121 7 1
27 35 121 7 1
Gewijzigd op 01/01/1970 01:00:00 door remco
Blijkbaar voldoen er in jouw geval dus maar 7 spelers aan die voorwaarde. Ofwel controleer waarom er niet meer spelers zijn, ofwel verander de voorwaarden die je stelt. Bijvoorbeeld door een of beide JOINs door een LEFT JOIN te vervangen. Vraag je dan natuurlijk wel af wat dat voor de resultaten inhoudt ;-)
Bij het opnieuw bekijken van de resultaten wordt het al snel duidelijk. Ik heb gewoon de speler_id opgeslagen in de kolom opstelling_id. Ik zal even kijken of het probleem daarmee opgelost wordt.
Een combinatie van wedstr_id en speler_id vormen samen een opstelling_id. Die zul je dus inderdaad in je beoordelingen tabel moeten gebruiken en dit laat ook zien dat de kolomm beoordelingen.wedstr_id overbodig is. Die kun je er dus uit knikkeren...
Iedereen die heeft geholpen in ieder geval erg bedankt