Ik heb volgende query:

		    SELECT 
			   c.*,
			   (SELECT COUNT(cursus_id) FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afhaling IS  NULL AND datum_verwijderd IS NULL AND studentid = '$studentid') as besteld,
			   (SELECT COUNT(cursus_id) FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afhaling IS NOT NULL AND datum_verwijderd IS NULL AND datum_afgehaald IS NULL AND studentid = '$studentid') as afhalen,
			   (SELECT datum_afhaling + INTERVAL 14 DAY FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afhaling IS NOT NULL AND datum_verwijderd IS NULL AND datum_afgehaald IS NULL AND studentid = '$studentid') as datum_afhaling,
			   (SELECT COUNT(cursus_id) FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afgehaald IS NOT NULL AND datum_verwijderd IS NULL AND cb.studentid = '$studentid') as afgehaald
			FROM 
			   cursusdienst c
			LEFT JOIN
			   cursusdienst_bestellingen cb
			ON
			   cb.cursus_id = c.id    
			WHERE 
			   c.studierichting = '1ste Bachelor'
			ORDER BY 
			   c.artikel asc, cb.studentid


Het betreft hier een reservatie/bestellingsdienst voor studenten die aan de universiteit cursussen kunnen bestellen/reserveren. Er zijn dus meerdere studenten die inloggen, en na inloggen kunnen bestellen.
Maar het gaat fout want ik krijg meerdere resultaten van elke bestelling door elkaar.
De studentid is de id die ik terugkrijg na inloggen in het systeem. Dus ik wil maar enkel mijn eigen bestellingen zien met de bijhorende status en niet de resultaten van anderen.
In de tabel cursusdienst staan alle cursussen die te reserveren zijn en in de tabel cursusdienst_bestellingen alle bestellingen van de studenten.

Wat ik nu te zien krijg is:

Checkbox         Artikel                      Prijs     Status
Checkbox         Belgisch publiekrecht        12.00     Besteld
Checkbox         Belgisch publiekrecht        12.00     Besteld
Checkbox         Rechtsgeschiedenis           25.50     Af te halen
Checkbox         Syllabus                     15.00     

Dit is een voorbeeld van 2 studenten die ingelogged zijn in het systeem en een bestelling hebben achtergelaten.
Student 1 heeft Belgisch publiekrecht en Rechtgeschiedenis besteld
Student 2 heeft Belgisch publiekrecht besteld
Cursus Syllabus staat ook in de lijst omdat die ook in de tabel cursusdienst zit en ik deze nog niet heb besteld (maar die heeft ook geen status omdat die nog is besteld en dat is normaal).

Dus zoals je kan zien krijg ik dat door elkaar wat dus niet juist is want student 1 mag enkel zijn resultaten zien en student 2 ook enkel de zijne.

OPLOSSING:

            SELECT 
               c.*,
               (SELECT COUNT(cursus_id) FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afhaling IS  NULL AND datum_verwijderd IS NULL AND studentid = '$studentid') as besteld,
               (SELECT COUNT(cursus_id) FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afhaling IS NOT NULL AND datum_verwijderd IS NULL AND datum_afgehaald IS NULL AND studentid = '$studentid') as afhalen,
               (SELECT datum_afhaling + INTERVAL 14 DAY FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afhaling IS NOT NULL AND datum_verwijderd IS NULL AND datum_afgehaald IS NULL AND studentid = '$studentid') as datum_afhaling,
               (SELECT COUNT(cursus_id) FROM cursusdienst_bestellingen where cursus_id = c.id AND datum_afgehaald IS NOT NULL AND datum_verwijderd IS NULL AND cb.studentid = '$studentid') as afgehaald
            FROM 
               cursusdienst c
            LEFT JOIN
               cursusdienst_bestellingen cb
            ON
               cb.cursus_id = c.id AND cb.studentid = '$studentid'    
            WHERE 
               c.studierichting = '1ste Bachelor'
            ORDER BY 
               c.artikel asc, cb.studentid

Dus de cb.studentid = '$studentid' moet je toevoegen aan de ON en niet aan de WHERE clause.
Mis je niet een regel in je query met WHERE cb.studentid = HUIDIG_INGELOGD_ID? Waar je HUIDIG_INGELOGD_ID ergens uit je cookie/sessie of database haalt.
Als ik deze toevoeg aan mijn WHERE: c.studierichting = '1ste Bachelor' AND cb.studentid = '$studentid' dan krijg ik enkel maar mijn eigen gereserveerde cursussen en niet degene die ook in de tabel zitten die ik niet heb gereserveerd. Uiteraard hebben die laatste dan wel geen status maar dat is normaal.

[size=xsmall]Toevoeging op 06/10/2016 10:22:25:[/size]

Het is opgelost: ik moest de AND cb.studentid = '$studentid' toevoegen aan de ON ipv aan de WHERE clause. Nu werkt het wel.

Reageren