[MySQL] Left en Right Joins

Pagina: 1
Acties:

  • Bever
  • Registratie: Maart 2001
  • Laatst online: 17-08 16:00
Ik ben in de SQL FAQ aan het lezen geweest en daarin staat iets over LEFT en RIGHT joins.

Nu heb ik een paar tabellen (in een MySQL Database):
Tabel werknemers:
idnaamvestiging
1willemsen1
2Jansen2
3Pietersen1


Tabel vestigingeng:
idnaamplaats
1WTCNew York
2BTCEnschede
3ABCLochem


Als ik nu een LEFT JOIN doe:
code:
1
2
3
4
5
6
7
SELECT 
vestigingen.naam,
vestigingen.plaats,
werknemers.naam AS werknemer
    FROM vestigingen
    LEFT JOIN werknemers
        ON (vestigingen.id = werknemers.vestiging);

Dan krijg ik alle vestigingen en alle werknemers, dus als een vestiging meerdere werknemers heeft wordt deze meerdere keren getoond, ook als een vestiging geen werknemers heeft wordt deze getoond.

Doe ik nu een right join:
code:
1
2
3
4
5
6
7
SELECT 
vestigingen.naam,
vestigingen.plaats,
werknemers.naam AS werknemer
    FROM werknemers
    RIGHT JOIN vestigingen
        ON (vestigingen.id = werknemers.vestiging);

Dan zou ik moeten krijgen: Alle werknemers en de daarbij behorende vestigingen, dus niet een vestiging zonder werknemers. Maar het resultaat is echter dat ik ook vestigingeng zonder werknemers krijg.

In de Faq staat dus dat dit niet zo is, als ik de tabellen goed begrijp.

Doe ik iets verkeerd, begrijp ik iets verkeerd, komt het omdat MySQL zich niet aan de SQL regeltjes houd, of is de FAQ niet juist? Helpt u mij ;)

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Je 2 queries zullen voor zover ik het bekeken heb dezelfde resultaten returnen, aangezien je niet alleen je LEFT keyword naar RIGHT hebt verandered, maar ook nog eens de volgorde van je tabellen.

https://fgheysels.github.io/


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Je joint nu 2 keer hetzelfde. De eerste keer een left join vanuit vestigingen en de tweede keer een right join vanuit werknemers.

Als je een left join doet vanuit werknemers of een right join vanuit vestigingen dn krijg je wat jij bedoelt.

Edit: whoami is me te snel af.

[ Voor 7% gewijzigd door Creepy op 28-10-2003 11:06 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Bever
  • Registratie: Maart 2001
  • Laatst online: 17-08 16:00
Ik zie het, maar in de FAQ wisselen ze de tabellen ook om en daar zie je in de samenvatting dat dit een ander resultaat zou opleveren. Dit lijkt me dan niet juist in de FAQ ofwel?

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Er staat in de FAQ bij Right Joins dit:
Een RIGHT join is feitelijk het tegenovergestelde van een LEFT JOIN. Je gebruikt deze wanneer bij een relatie n:1, waarbij n ≥ 0. Dus je zou bovenstaande query kunnen herschrijven tot een RIGHT join query door de 2 tabellen om te wisselen
de LEFT join query herschrijven tot een right join impliceert dus dat die 2 queries dezelfde resultaten moeten teruggeven, vandaar dat die tabellen natuurlijk ook omgewisseld werden.

Bij de samenvatting staat ook nog een legende. ;)

https://fgheysels.github.io/


  • Bever
  • Registratie: Maart 2001
  • Laatst online: 17-08 16:00
whoami schreef op 28 October 2003 @ 11:16:
Er staat in de FAQ bij Right Joins dit:


[...]


de LEFT join query herschrijven tot een right join impliceert dus dat die 2 queries dezelfde resultaten moeten teruggeven, vandaar dat die tabellen natuurlijk ook omgewisseld werden.

Bij de samenvatting staat ook nog een legende. ;)
De tabellen worden omgewisseld, dus je krijgt hetzelfde resultaat, dat snap ik. Maar bij die samenvatting (voorbeeld tabellen) staat toch niet hetzelfde? Daar worden andere rijen weergegeven (geselecteerd).

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Hmmm, ja... OK.
*noted*

https://fgheysels.github.io/


  • Bever
  • Registratie: Maart 2001
  • Laatst online: 17-08 16:00
Bedankt :)

(de anderen die mij hielpen ook)

  • mjax
  • Registratie: September 2000
  • Laatst online: 28-07 20:20
Gebruik eens een INNER JOIN. Volgens mij lost dat je probleem op.

  • Bever
  • Registratie: Maart 2001
  • Laatst online: 17-08 16:00
mjax schreef op 28 October 2003 @ 11:25:
Gebruik eens een INNER JOIN. Volgens mij lost dat je probleem op.
Het is niet echt een probleem, ik ben een verslag aan het maken over SQL en daarbij wil ik dus alle soorten joins uitleggen met behulp van voorbeelden. Zodoende kwam ik dit tegen.

  • BetuweKees
  • Registratie: Januari 2003
  • Laatst online: 15-05 20:44

BetuweKees

Flipje uit Tiel

offtopic:
mag ik het lezen als je klaar bent? :)
snap nog steeds het verschil tussen LEFT, RIGHT en INNER JOIN niet, maar dat zal aan mij liggen..

Through meditation I program my heart to beat breakbeats and hum basslines on exhalation -Blackalicious || *BetuweKees was AFK; op de fiets richting China en verder


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 18:29
Dat denk ik ook ja, zelf ik begrijp het ;)
Inner join geeft alleen de geldige records, de records die dus voldoen aan de voorwaarden die in het ON gedeelte staan. Bij een left of een right join worden alle records genomen, (eventueel door de WHERE beperkt) in de linker respectievelijk de rechter tabel. Het kan dan dus voorkomen dat je een waarde uit de linker tabel krijgt, maar de waarde NULL uit de rechtertabel omdat deze niet bestaat.

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 15-07 20:09

dArtagnan

Een voor allen, allen voor een

BetuweKees schreef op 28 oktober 2003 @ 19:37:
offtopic:
mag ik het lezen als je klaar bent? :)
snap nog steeds het verschil tussen LEFT, RIGHT en INNER JOIN niet, maar dat zal aan mij liggen..
Left join
Een dergelijke join selecteerd alle rijen uit de linker tabel. En als er een match is dan zullen ook die rijen uit de rechter tabel worden vermeldt.

Right join
Een dergelijke join selecteerd alle rijen uit de rechter tabel. En als er een match is dan zullen ook die rijen uit de linker tabel worden vermeldt.

Inner join
Selecteer alle rijen met een match.

  • Bever
  • Registratie: Maart 2001
  • Laatst online: 17-08 16:00
BetuweKees schreef op 28 October 2003 @ 19:37:
offtopic:
mag ik het lezen als je klaar bent? :)
snap nog steeds het verschil tussen LEFT, RIGHT en INNER JOIN niet, maar dat zal aan mij liggen..
Als je nou een mail adres had staan in je profiel dan kon ik 't mailen ;)
Pagina: 1