Toon posts:

[(My)SQL] ON .. bij joins

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi

Op dit site van MySQL.com zag ik volgende omerking ivm. de 'ON' bij joins:
You should generally not have any conditions in the ON part that are used to restrict which rows you want in the result set, but rather specify these conditions in the WHERE clause. There are exceptions to this rule.
Weten jullie wat die exceptions kunnen zijn? Natuurlijk moet je bij een LEFT en RIGHT (OUTER) JOIN je condities in de JOIN clause zetten, ipv. de WHERE, maar er zijn vast nog andere uitzonderingen?

Ik zelf schrijf ze altijd in de WHERE, maar ik vroeg het mij ineens af wat ze ermee zouden bedoelen ;)

thanks!

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Er wordt bedoeld dat je geen 'filters' in die ON clause moet zetten, enkel een statement die aangeeft met wat je wilt joinen.
Met filters bedoel ik bv 'toon enkel de rows met id = 5'.
Zo'n dingen moeten in de WHERE clause.

Trouwens, OUTER joins kan je ook in de WHERE clause definieren.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 23 September 2003 @ 20:52:
Er wordt bedoeld dat je geen 'filters' in die ON clause moet zetten, enkel een statement die aangeeft met wat je wilt joinen.
Ah ok, zo doe ik het: ik zet alles in de where, behalve de koppeling van de foreign keys. Dat bedoelen ze toch?
Trouwens, OUTER joins kan je ook in de WHERE clause definieren.
Ja, maar ik bedoelde een voorbeeld als:

code:
1
2
3
SELECT tabel1.iets, tabel3.iets FROM tabel
LEFT JOIN tabel2 on tabel1.id = tabel2.id
LEFT JOIN tabel3 ON tabel2.id = tabel3.id AND tabel2.timestamp < tabel3.timestamp
In zo'n geval kan je die timestamp conditie toch niet in de where class zetten, want dan 'verneuk' je de werking van de LEFT JOIN en krijg je eigenlijk een gewone JOIN? (INNER JOIN heet dat zeker?)

[ Voor 3% gewijzigd door Verwijderd op 23-09-2003 20:57 ]


  • Maxonic
  • Registratie: September 2000
  • Laatst online: 28-07 22:38
is dit niet hetzelfde als:
code:
1
2
3
4
5
SELECT tabel1.iets AS iets1, tabel3.iets AS iets3 
FROM tabel1, tabel2, tabel3
WHERE tabel1.id = tabel2.id
AND tabel2.id = tabel3.id 
AND tabel2.timestamp < tabel3.timestamp

:?

Verwijderd

Topicstarter
Euhm neen? Bij mijn query heb je altijd resultaten (als tabel1 niet leeg is natuurlijk) op column tabel1.iets, en eventueel resultaten voor tabel3.iets; anders zijn deze NULL.

ivm de discussie: als je die timestamp conditie nu in de WHERE zet (in mijn query dus), heb je voor tabel1.iets alleen waarden als hij 'tot aan tabel3 kan linken', dus maw. als beide LEFT JOINS 'overbodig' waren en een gewone INNTER JOIN was (NULL < NULL is immers UNKNOWN), dus maw. hetzelfde effect als jouw query of de mijne met 2 keer INNER JOIN.