[MySQL] LEFT JOIN met NULL values

Pagina: 1
Acties:
  • 906 views sinds 30-01-2008
  • Reageer

  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Topicstarter
Me heb een probleem met maieskjuel MySQL 3.x. Situatieschets:
Ik heb een basis tabel (persons) met 4 records:

id, name
1. kees
2. sjaak
3. flip
4. joep

En een kopel tabel (sending) met meerdere records:

person_id, letter_id
1. 3.
2. 5.
3. 5.
3. 2
2. 1

Nu wil ik weten wie een bepaalde brief (letter_id = x) heeft ontvangen, en wel zo dat ik alle persoon namen terug krijg met daarachter een kolom ja / nee.

letter_id:5
kees nee
sjaak ja
flip ja
joep nee

Dit wordt dus een SELECT uit de persons tabel met een LEFT JOIN op de sending tabel. Punt is dat een persoon ook andere brieven ontvangen kan hebben, of nog geen enkele. In het geval een persoon meerdere brieven heeft ontvangen moet er alleen de letter_id = 5 terug komen.
In het geval een persoon nog niets heeft ontvangen moet zijn naam wel in het resultaat terug komen.

Een WHERE clause geeft te weinig terug, namelijk niet de personen die nog niks hebben ontvangen. Een gewone join geeft te veel terug, namelijk alle mogelijkheden.

Is er iemand die mij kan vertellen hoe ik dit probleem kan aanpakken?

[ Voor 2% gewijzigd door NMe op 27-09-2005 21:19 . Reden: Als je jezelf een beetje verstaanbaar wil maken, noem het beestje dan asjeblieft gewoon bij zijn naam. :) ]

On track


  • [ash]
  • Registratie: Februari 2002
  • Laatst online: 05-04-2025

[ash]

Cookies :9

zoiets?
SQL:
1
2
SELECT p.name, s.letter_id FROM persons p
LEFT JOIN sendings s ON s.person_id=p.id AND s.letter_id=5

  • Reinier
  • Registratie: Februari 2000
  • Laatst online: 16:28

Reinier

\o/

Left outer join?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

[ash] schreef op dinsdag 27 september 2005 @ 21:11:
zoiets?
SQL:
1
2
SELECT p.name, s.letter_id FROM persons p
LEFT JOIN sendings s ON s.person_id=p.id AND s.letter_id=5
Waarschijnlijk werkt dat niet helemaal. :)
SQL:
1
2
SELECT p.name, s.letter_id FROM persons p
LEFT JOIN sendings s ON s.person_id=p.id AND (s.letter_id=5 OR s.letter_id IS NULL)

Dat lijkt me al beter te moeten werken. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Topicstarter
Thanx -NMe-!

Dat was inderdaad waar ik naar op zoek was! Extra restricties op je join. Super bedankt!

On track


  • [ash]
  • Registratie: Februari 2002
  • Laatst online: 05-04-2025

[ash]

Cookies :9

-NMe- schreef op dinsdag 27 september 2005 @ 21:18:
Waarschijnlijk werkt dat niet helemaal. :)
SQL:
1
2
SELECT p.name, s.letter_id FROM persons p
LEFT JOIN sendings s ON s.person_id=p.id AND (s.letter_id=5 OR s.letter_id IS NULL)

Dat lijkt me al beter te moeten werken. :)
Waarom zou mijn oplossing niet werken?
s.letter_id is namelijk nooit NULL, als een bepaald persoon een bepaalde brief niet gekregen heeft bestaat daar namelijk geen record voor in de sendings tabel. De NULL values die onstaan in het resultaat zijn niet van toepassing tijdens de evaluatie van de JOIN criteria.

Test het maar eens.

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:31

https://fgheysels.github.io/


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Testen laat ik graag aan de topicstarter over, maar nu ik erover nadenk zou je inderdaad wel eens gelijk kunnen hebben. Als de extra conditie echter in een WHERE clausule zou staan, waar ie IMO ook thuishoort, dan klopt het in elk geval wel dat je moet vergelijken met NULL. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Topicstarter
[ash] heeft (ook) gelijk.
Tnx! :)

On track


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
-NMe- schreef op dinsdag 27 september 2005 @ 21:42:
Als de extra conditie echter in een WHERE clausule zou staan, waar ie IMO ook thuishoort, dan klopt het in elk geval wel dat je moet vergelijken met NULL. :P
mwoah, in gevallen als deze kun je juist goed extra criteria in de join clausule opgeven denk ik. Ik heb niet het idee dat je dan iets ranzigs aan het doen bent.

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1