Resultaat ID's uitsluiten in de volgende query
Voor een aanwezigheidssysteem heb ik 2 database tabellen:
1. leerlingen tabel; hierin heeft de leerling een id en staat informatie vermeld
2. afwezigheid tabel; hierin staat per regel de datum en het id van de leerling vermeld die er die dag niet is.
Nu is het zo dat ik alle leerlingen uit de leerlingen tabel wil halen, behalve van de IDs die in de afwezigheid tabel staan.
Hoe kan ik dus een query maken die het resultaat van query 1 (de afwezigheid IDs) gebruiken om deze uit te sluiten in de SELECT van de tweede query?
(Ik hoop dat het duidelijk is)
Bedankt!
Rick
Gewijzigd op 20/06/2013 10:32:34 door Chris PHP
Dus:
Code (php)
1
2
3
4
5
2
3
4
5
SELECT l.leerling_id, l.leerling_naam
FROM leerlingen AS l
LEFT JOIN afwezigheid AS a
ON l.leerling_id = a.leerling_id AND a.datum = '2013-06-20'
WHERE a.leerling_id IS NULL
FROM leerlingen AS l
LEFT JOIN afwezigheid AS a
ON l.leerling_id = a.leerling_id AND a.datum = '2013-06-20'
WHERE a.leerling_id IS NULL
Gewijzigd op 20/06/2013 10:49:07 door Ger van Steenderen
Code (php)
1
2
3
4
2
3
4
SELECT leerlingen.id, leerlingen.naam
FROM leerlingen
LEFT JOIN afwezigheid on afwezigheid.leerling = leerlingen.id
WHERE afwezigheid.datum IS NULL
FROM leerlingen
LEFT JOIN afwezigheid on afwezigheid.leerling = leerlingen.id
WHERE afwezigheid.datum IS NULL
Werd er trouwens gevraagd naar leerlingen die vandaag aanwezig zijn, of leerningen die nooit afwezig zijn geweest?
Afhankelijk daarvan heb je die AND a.datum = '2013-06-20' nodig of niet.
---
Zeg, iets anders:
'uit te halen', 'uit te sluiten' ...
Dat zijn verwarrende termen in de context van een database.
(In de echte wereld verdwijnen dingen als je ze ergens uit haalt. In de IT wordt een kopie gestuurd, en blijft het origineel op zijn plaats)
Waarschijnlijk is het beter te spreken over lezen, verwijderen, ... woorden die niet voor interpretatie vatbaar zijn.
Ger van Steenderen op 20/06/2013 10:46:21:
Bedankt! Zal je kunnen uitleggen wat die query precies doet? Ik wil er namelijk ook van leren :)
Met een JOIN krijg je een niewe tabel te zien, die zowat bestaat uit de ledentabel, maar waar twee kolommen zijn bijgekomen.
Elk record heeft nu dus (+ de extra velden die je niet genoemd hebt)
leerlingen.id, leerlingen.naam, afwezigheid.leerlings_id, afwezigheid.datum
LEFT JOIN: bij LEFT JOIN wordt sowieso elk record van de leerlingen getoond, ook wanneer er geen afwezigheid bij het record hoort. Dan krijg je dus NULL
(Bij RIGHT JOIN en INNER JOIN ... zoek het zelf nog eens deftig op, lastig om deftig uit te leggen in een paar woorden)
dus -> met IS NULL in de query lees je enkel de leerlingen waarmee geen enkele afwezigheid overeen komt.
Gewijzigd op 20/06/2013 12:38:12 door Kris Peeters
Een left join selecteert (in dit geval) alle records uit de linker tabel, wordt aan de join volwaarde voldaan krijgen de kolommen uit de rechter tabel een waarde, anders blijven ze leeg.
Een right join doet het omgekeerde.
Met inner join worden alleen de records uit de linker tabel geselecteerd die voldoen aan de join voorwaarden.
Wil je dus de afwezige leerlingen tonen gebruik je een inner join en haal je de where a.leerling_id IS NULL weg
Gewijzigd op 20/06/2013 12:50:04 door Ger van Steenderen
Bedankt allemaal! Ik ga ermee aan de slag!