Opgelost: MySQL haal niet alle resultaten op.
Ik heb op mijn fansite van Heerenveen een speler rating systeem gemaakt en het werkt bijna allemaal helemaal goed alleen loop ik tegen een klein probleempje 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
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
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
Heb de SQL een beetje aangepast maar nu reageert PHPMyAdmin helemaal vaag. Als ik de query uitvoer gaat hij naar het begin scherm van PHPMyAdmin zonder enig resultaat te weergeven en zonder een foutmelding te geven.
Onderstaande is mijn nieuwe SQL-code
Weet iemand ook hoe ik het anders kan doen of wat de reden is van het vage gedrag van PHPMyAdmin
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
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 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...
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?
Sorry dat was ik er vergeten bij te zetten.... is een foutje bij het kopiëren en plakken geweest.
Dit is hem zoals hij was:
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:
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.
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?
@SanThe hmmm... verkeerd gelezen volgens mij. Het was niet mijn bedoeling over zijn opmerking heen te lezen en ik zal even bekijken. Ik had de ORDER BY veranderd maar dat was ook niet echt de bedoeling.
Heb het veranderd en ik krijg nu wel weer resultaten in PHPMyAdmin maar er verschijnen wederom maar 10 resultaten.
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
De query netjes uitgeschreven en logischer opgebouwd (je gaat immers uit van de spelers tabel waar je de overige tabellen op joined):
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...
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...
Allereerst erg bedankt voor de snelle hulp. Het probleem blijft echter.
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:
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
Zoals ik zeg, deze query zal alleen de spelers terug geven die in de opstelling tabel aan de betreffende wedstrijd gekoppeld zijn én waarvoor in de beoordeling tabel een beoordeling voor het betreffende opstelling_id is opgenomen.
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 ;-)
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...
Het probleem is inmiddels opgelost. Nu werkt mijn query ook weer gewoon. Neemt niet weg dat die niet zo is zoals hij hoort te zijn maar ik ben dan ook geen professional. Ik zal ook de query van Blanche nog eens aandacht doornemen en zo kijken of ik kan ontdekken hoe het nou precies zit met die JOINs.
Iedereen die heeft geholpen in ieder geval erg bedankt
Iedereen die heeft geholpen in ieder geval erg bedankt




