Toon posts:

[SQL] Left join werkt niet goed

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een query gemaakt om de werknemers van een bepaald bedrijf op te halen. Aan deze query left join ik de tabel CONTACT_SOORT. Als er contact is geweest met een werknemer, komt in deze tabel een rij voor met hetzelfde werknemer id. Helaas moet er ook een conditie aan de tabel CONTACT_SOORT hangen, namelijk (in dit geval) CONTACT_SOORT = 2. Hierdoor laat de query alleen die werknemers zien die ook voorkomen in de contacten tabel. En ik wil alle werknemers zien!!!

Hier is de query:

SELECT TBL_WERKNEMERS.* FROM TBL_WERKNEMERS INNER JOIN TBL_OFFICE_CONTACTEN ON TBL_OFFICE_CONTACTEN.WERKNEMER_ID = TBL_WERKNEMERS.WERKNEMER_ID WHERE WERKGEVER_ID = 18 AND (CONTACT_SOORT = 2 OR CONTACT_SOORT IS NULL) ORDER BY CONTACT_DATUM ASC, ACHTERNAAM ASC

Ik werk in php en gebruik een mysql database.

  • SilentThunder
  • Registratie: September 2001
  • Laatst online: 23:01
kan je dan van die inner join niet gewoon left join maken? :?

Canon EOS 40D | Canon EF-S 10-22mm F/3.5-4.5 USM | Tamron 17-50mm F/2.8 | Canon EF 50mm F/1.8 II | Canon EF 70-200mm F/4L IS USM | Speedlite 430EX


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
LEFT JOIN TBL_OFFICE_CONTACTEN ON BL_OFFICE_CONTACTEN.WERKNEMER_ID = TBL_WERKNEMERS.WERKNEMER_ID AND TBL_OFFICE_CONTACTEN.Soort = 2
WHERE [..]


Je kunt dus additonele criteria in je JOIN statement opnemen

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


Verwijderd

Je vraag is een beetje warrig, ik neem aan dat je niet 'de tabel contact_soort' bedoelt, maar 'het veld contact_soort' ?

je query:

code:
1
2
3
4
5
6
7
8
9
10
11
SELECT
  TBL_WERKNEMERS.*
FROM
  TBL_WERKNEMERS INNER JOIN TBL_OFFICE_CONTACTEN
ON
  TBL_OFFICE_CONTACEN.WERKNEMER_ID=TBLWERKNEMERS.WERHNEMER_ID
WHERE
   WERKGEVER_ID = 18 AND
   (CONTACT_SOORT = 2 OR CONTACT_SOORT IS NULL)
ORDER BY
  CONTACT_DATUM ASC, ACHTERNAAM ASC


is zo al een stuk leesbaarder.

Aangezien je ook werknemers wilt laten zien die niet ind e tabel TBL_OFFICE_CONTACTEN voorkomen, kun je niet met een left inner join werken. Probeer eens een outter join ;)

Verwijderd

Topicstarter
P_de_B schreef op vrijdag 26 november 2004 @ 09:28:
LEFT JOIN TBL_OFFICE_CONTACTEN ON BL_OFFICE_CONTACTEN.WERKNEMER_ID = TBL_WERKNEMERS.WERKNEMER_ID AND TBL_OFFICE_CONTACTEN.Soort = 2
WHERE [..]


Je kunt dus additonele criteria in je JOIN statement opnemen
Geprobeerd, zelfde resultaat. Het probleem zit hem in de criteria voor "soort". Hoe kan "soort" 2 zijn als "soort" niet bestaat in de andere tabel... Ik heb daarom er ook in dat soort null mag zijn, maar dat helpt ook niet.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Verwijderd schreef op vrijdag 26 november 2004 @ 09:32:
[...]


Geprobeerd, zelfde resultaat. Het probleem zit hem in de criteria voor "soort". Hoe kan "soort" 2 zijn als "soort" niet bestaat in de andere tabel... Ik heb daarom er ook in dat soort null mag zijn, maar dat helpt ook niet.
Dit moet gewoon werken hoor, weet je zeker dat de SOORT = 2 niet in het where statement hebt gezet? Daar moet het niet staan nl. het moet in de join criteria.

Copy/paste anders je query eens?

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


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Je gebruikt in je query inderdaad een INNER join, geen LEFT (outer) JOIN... Dan gaat de "left join" (die je niet gebruikt) idd nooit goed ;)
Een LEFT INNER JOIN bestaat overigens niet, dat is onmogelijk.

Verder kan je het best de CONTACT_SOORT-conditie bij de (left) join conditie AND-en, zoals P_de_B stelt, dan is het namelijk duidelijker dat je alle medewerkers met contact_soort=2 wilt aanvullen, niet met contact_soort = 2 of null (want dan mis je 1, 3, 4, etc) achter er uit wilt filteren.

Verwijderd

Topicstarter
Het is gelukt!
Het was een kwestie van haken op de juiste plaats zetten:
code:
1
2
3
4
5
6
7
SELECT * FROM TBL_WERKNEMERS 
LEFT JOIN TBL_OFFICE_CONTACTEN ON 
(
TBL_OFFICE_CONTACTEN.WERKNEMER_ID = TBL_WERKNEMERS.WERKNEMER_ID AND CONTACT_SOORT = 1
)
WHERE WERKGEVER_ID = 18 
ORDER BY CONTACT_DATUM ASC, ACHTERNAAM ASC

Dank iedereen voor de hulp!
( http://dev.mysql.com/doc/mysql/en/JOIN.html , zoeken naar 'David Martin')
Pagina: 1