Resultaat ID's uitsluiten in de volgende query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Rick de Jong

Rick de Jong

20/06/2013 09:37:03
Quote Anchor link
Hallo allemaal,

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
 
PHP hulp

PHP hulp

08/05/2024 05:42:17
 
Gerhard l

gerhard l

20/06/2013 10:25:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SELECT
    *
FROM
    leerlingen
WHERE
    leerlingID
NOT IN
    (
        SELECT leerlingID FROM afwezigheid
    )
 
Chris PHP

Chris PHP

20/06/2013 10:31:55
Quote Anchor link
...
Gewijzigd op 20/06/2013 10:32:34 door Chris PHP
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/06/2013 10:46:21
Quote Anchor link
Bij voorkeur geen subqueries in de where clause, dit heeft altijd een full table scan tot gevolg.
Dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
Gewijzigd op 20/06/2013 10:49:07 door Ger van Steenderen
 
Kris Peeters

Kris Peeters

20/06/2013 12:03:34
Quote Anchor link
Ja, ik had ook zo iets

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT leerlingen.id, leerlingen.naam
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.
 
Rick de Jong

Rick de Jong

20/06/2013 12:26:32
Quote Anchor link
Ger van Steenderen op 20/06/2013 10:46:21:
Bij voorkeur geen subqueries in de where clause, dit heeft altijd een full table scan tot gevolg.
Dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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



Bedankt! Zal je kunnen uitleggen wat die query precies doet? Ik wil er namelijk ook van leren :)
 
Kris Peeters

Kris Peeters

20/06/2013 12:36:34
Quote Anchor link
Wel, dit is een simpele JOIN.

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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/06/2013 12:47:55
Quote Anchor link
Een join betekent dat je de kolommen uit twee (of meerdere) tabel(len) samenvoegt tot één projectie.

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
 
Rick de Jong

Rick de Jong

20/06/2013 13:01:46
Quote Anchor link
Bedankt allemaal! Ik ga ermee aan de slag!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.