[SQL] Left outer Join met 3 tabellen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • rickhansen
  • Registratie: Februari 2006
  • Laatst online: 06-09 12:02
Ik heb 3 tabellen:

doelpunten:
doelpunt_ID
wedstrijd_ID
id

gebruikers:
id
gebruikersnaam

wedstrijd:
wedstrijd_ID
date

Ik wil een lijst maken van gebruikersnaam en het aantal scores. Hier gebruik ik de volgende sql query voor:

SQL:
1
2
3
4
5
SELECT gebruikers.gebruikersnaam, COUNT(doelpunten.doelpuntID) AS aantaldoelpunten, gebruikers.id 
FROM gebruikers 
LEFT OUTER JOIN doelpunten ON gebruikers.id = doelpunten.id 
GROUP BY gebruikersnaam 
order by aantaldoelpunten DESC


Dit werkt goed ik krijg netjes alle namen en het aantal scores. Alleen wil ik kunnen kiezen om alleen de scores te laten zien van een bepaalde datum. Hier gebruik ik de volgende sql query voor:

SQL:
1
2
3
4
5
6
7
SELECT gebruikers.gebruikersnaam, COUNT(doelpunten.doelpuntID) AS aantaldoelpunten, gebruikers.id 
FROM gebruikers 
LEFT OUTER JOIN doelpunten ON gebruikers.id = doelpunten.id
LEFT OUTER JOIN wedstrijd ON wedstrijd.wedstrijdID = doelpunten.wedstrijdID
WHERE date = 20100107 
GROUP BY gebruikersnaam 
order by aantaldoelpunten DESC


Hij telt nu alleen het aantal scores op van 7 januari 2010, alleen laat hij alleen de gebruikersnamen zien van diegenen die een doelpunt heeft.

Weet iemand hoe ik alle gebruikersnamen weer kan geven?

Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Ik welke tabel zit trouwens je 'date' veld? Ik gok in wedstrijd. Als je begint bij wedstrijd en dan speler en dan doelpunt joint zou je wel alle spelers moeten zien.

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 11-09 19:49

Guldan

Thee-Nerd

Euh.. je kan toch gewoon in plaats van een left join een inner join gebruiken.. alle velden waarvan dan geen username is die worden dan gewoon met null in het resultaat weergegeven.

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


Acties:
  • 0 Henk 'm!

  • rickhansen
  • Registratie: Februari 2006
  • Laatst online: 06-09 12:02
eek schreef op zondag 10 januari 2010 @ 17:21:
Ik welke tabel zit trouwens je 'date' veld? Ik gok in wedstrijd. Als je begint bij wedstrijd en dan speler en dan doelpunt joint zou je wel alle spelers moeten zien.
date zit inderdaad in tabel wedstrijd.

Edit:

Hij lijkt het zo te doen:

SQL:
1
2
3
4
5
6
7
SELECT gebruikers.gebruikersnaam, COUNT(doelpunten.doelpuntID) AS aantaldoelpunten, gebruikers.id 
FROM doelpunten 
INNER JOIN wedstrijd ON wedstrijd.wedstrijdID = doelpunten.wedstrijd_ID
RIGHT OUTER JOIN gebruikers ON gebruikers.id = doelpunten.id
AND date = 20100107 
GROUP BY gebruikersnaam 
order by aantaldoelpunten DESC


Bedankt voor de hulp.

[ Voor 40% gewijzigd door rickhansen op 10-01-2010 17:51 ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Voor leesbaarheid zou je je join nog om kunnen draaien. De jouwe suggereert in de FROM dat de doelpunten leidend zijn, terwijl de gebruikers je uitgangspunt zijn.
SQL:
1
2
3
4
5
6
7
SELECT g.gebruikersnaam, COUNT(d.doelpuntID)
FROM 
gebruikers g
LEFT JOIN (doelpunten d
  JOIN wedstrijd w ON w.wedstrijdID = d.wedstrijd_ID AND w.date = 20100107)
 ON g.id = d.gebruikersid
GROUP BY gebruikersnaam

Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 14:23

Robtimus

me Robtimus no like you

ACM schreef op zondag 10 januari 2010 @ 19:11:
SQL:
1
2
3
4
5
6
7
SELECT g.gebruikersnaam, COUNT(d.doelpuntID)
FROM 
gebruikers g
LEFT JOIN (doelpunten d
  JOIN wedstrijd w ON w.wedstrijdID = d.wedstrijd_ID AND w.date = 20100107)
 ON g.id = d.gebruikersid
GROUP BY gebruikersnaam
Die haakjes zijn niet eens nodig; de plaatsing van de ON clause bepaalt al dat de tweede JOIN eerst moet worden uitgevoerd alvorens te joinen aan gebruikers.

... LEFT JOIN ... ON ... JOIN ... ON ... voert eerst de LEFT JOIN uit, dan de "gewone" JOIN.
... LEFT JOIN ... JOIN ... ON ... ON ... voert eerst de "gewone" JOIN uit, dan de LEFT JOIN. Dit komt omdat ON de eerste voorafgaande JOIN afsluit.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 13:21

Haan

dotnetter

Haakjes hoeven wel vaker niet, maar ze maken een statement vaak wel duidelijker en makkelijker leesbaar ;)

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Misschien wat minder technisch van aard, maar ben je niet ook geinteresseerd in welke speler en ploeg het doelpunt heeft gescoord? En welke ploegen de wedstrijden gespeeld hebben?
Pagina: 1