Wie kan dit? (SQL probleem)

Status
Niet open voor verdere reacties.

Sewdn

Nieuwe gebruiker
Lid geworden
30 dec 2007
Berichten
2
Hallo,

Ik heb een vraag ivm een SQLquery om meerdere tabellen te joinen.

ik heb 4 tabellen (tabel1, tabelB1, tabelB2, tabelB3) met allen een gemeenschappelijk index (id) en nog aparte velden per tabel.
In tabelA komen alle records voor.
in tabelB1, tabelB2, tabelB3 komen optioneel alle records voor.

Dus een record uit tabelA kan voorkomen in 0,1,2of 3 tabellen van de B tabellen.
VB:
id: 1 komt voor in tabelA, tabelB2 en tabelB3
id: 2 komt voor in tabelA, tabelB2
id: 3 komt voor in tabelA, tabelB1 en tabelB3

om nu alle records terug te krijgen met alle velden uit alle 4 de tabellen moet een LEFT JOIN gebruikt worden. Zover lukt alles:

SELECT * FROM tabelA
LEFT JOIN tabelB1 ON (tabelA.id = tabelB1.id)
LEFT JOIN tabelB2 ON (tabelA.id = tabelB2.id)
LEFT JOIN tabelB3 ON (tabelA.id = tabelB3.id)

Maar wat als ik nu records wil terugkrijgen met velden uit alle 4 de tabellen die nog aan EXTRA VOORWAARDEN voldoen?

SELECT * FROM tabelA
LEFT JOIN tabelB1 ON (tabelA.id = tabelB1.id)
LEFT JOIN tabelB2 ON (tabelA.id = tabelB2.id)
LEFT JOIN tabelB3 ON (tabelA.id = tabelB3.id)
WHERE tabelA.velda = 'voorwaarde1'

Dit lukt nog omdat ik enkel voorwaarden opleg uit tabelA waar alle records inzitten.

Maar als er extra voorwaarden worden opgelegd aan de andere tabellen B, doet de query niet meer het gevraagde (althans niet in MySQL5):

SELECT * FROM tabelA
LEFT JOIN tabelB1 ON (tabelA.id = tabelB1.id)
LEFT JOIN tabelB2 ON (tabelA.id = tabelB2.id)
LEFT JOIN tabelB3 ON (tabelA.id = tabelB3.id)
WHERE tabelA.velda = 'voorwaarde1'AND tabelB1.veldb1='voorwaardeB1' AND tabelB2.veldb2 = 'voorwaardeB2'

Iemand een oplossingen om het gewenste resultaat te bereiken?
Alvast bedankt!
 
Laatst bewerkt:
kun je wat tabel contents plaatsen? En wat komt eruit anders dan wat je zou verwachten?
 
Heb de oplossing gevonden voor het probleem...

Als je een voorwaarde ingeeft voor een LEFT JOIN 'samengevoegde' tabel, dan moet je er mee rekening houden dat er NULL komt te staan als de record niet voorkomt in de tabel.

In de voorwaarde neem je dus op dat het of NULL moet zijn of aan de voorwaarde moet voldoen:
SELECT * FROM tabelA
LEFT JOIN tabelB1 ON (tabelA.id = tabelB1.id)
LEFT JOIN tabelB2 ON (tabelA.id = tabelB2.id)
LEFT JOIN tabelB3 ON (tabelA.id = tabelB3.id)
WHERE tabelA.velda = 'voorwaarde1'AND (tabelB1.veldb1 IS NULL OR tabelB1.veldb1='voorwaardeB1') AND (tabelB2.veldb2 IS NULL OR tabelB2.veldb2 = 'voorwaardeB2')
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan