Opgelost: MySQL haal niet alle resultaten op.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Remco

remco

26/01/2009 20:39:00
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

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
 
PHP hulp

PHP hulp

24/11/2024 03:50:27
 
Klaasjan Boven

Klaasjan Boven

26/01/2009 20:44:00
Quote Anchor link
Dan kloppen je JOINS niet. Tevens klopt je GROUP BY ook niet
 
Remco

remco

26/01/2009 21:37:00
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

Weet iemand ook hoe ik het anders kan doen of wat de reden is van het vage gedrag van PHPMyAdmin
 
Joren de Wit

Joren de Wit

26/01/2009 21:44:00
Quote Anchor link
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...
 
- SanThe -

- SanThe -

26/01/2009 21:44:00
Quote Anchor link
Waar komt op.id vandaan?
 
Remco

remco

26/01/2009 21:49:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

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)
PHP script in nieuw venster Selecteer het PHP script
1
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

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.
 
- SanThe -

- SanThe -

26/01/2009 21:55:00
Quote Anchor link
Waarom negeer je Blanche zijn opmerking over GROUP BY?
 
Remco

remco

26/01/2009 22:00:00
Quote Anchor link
@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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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
Gewijzigd op 01/01/1970 01:00:00 door remco
 
Joren de Wit

Joren de Wit

26/01/2009 22:08:00
Quote Anchor link
De query netjes uitgeschreven en logischer opgebouwd (je gaat immers uit van de spelers tabel waar je de overige tabellen op joined):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

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...
 
Remco

remco

26/01/2009 22:13:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
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
Gewijzigd op 01/01/1970 01:00:00 door remco
 
Joren de Wit

Joren de Wit

26/01/2009 22:17:00
Quote Anchor link
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 ;-)
 
Remco

remco

26/01/2009 22:22:00
Quote Anchor link
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.
 
Joren de Wit

Joren de Wit

26/01/2009 22:26:00
Quote Anchor link
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...
 
Remco

remco

26/01/2009 22:34:00
Quote Anchor link
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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.