Archief - Hulp bij query

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

passero

Legacy Member
Mijn vriendin is leerkracht en ik ben nu iets aan het schrijven voor haar om haar punten beter te beheren want dat systeem dat ze opt school krijgen trekt op de ballen.

Nu, ik ben bezig met het schrijven van een query waarmee de punten van een bepaalde test getoond worden. Op zich niet moeilijk maar ik moet rekening houden dat er leerlingen kunnen bijkomen bij de klas en daar wordt het moeilijk.

Mijn datamodel:
punten (id,lln_id,punt,test_id)
leerlingen (id,klas_id)
klassen (id)

er zijn nog andere velden maar deze zijn belangrijkst.

Momenteel heb ik deze query:

Code:
select p.*,lln.naam from punten p,leerlingen lln,klassen k
where p.lln_id = lln.id
and k.id = lln.klas_id
and k.id = 1
union
select null,null,null,null, lln.naam from leerlingen lln,klassen k
where lln.klas_id = k.id
and k.id = 1
and lln.id not in
  (select p.lln_id from punten p,leerlingen lln,klassen k
    where p.lln_id = lln.id
    and k.id = lln.klas_id
    and k.id = 1)

HEt lijkt me nogal ingewikkeld voor wat ik moet doen.
DE query is voor een mysql db maar gezien ik dagdagelijks in een oracle omgeving programmeer gebruik ik geen inner of outer joins maar zet ik die dingen gewoon in de where clause.

Ik heb wel al eens geprobeerd door een query te schrijven die de leerlingen van een klas toont en dan via een outer join naar de punten te gaan maar dit geeft ook problemen gezien ik eigenlijk ook de test_id als parameter moet meegeven. Vandaar dat ik gewerkt heb met eerst de leerlingen te tonen die deelgenomen hebben aan de test en dan via een union de leerlingen toevoegen die niet deelnemen maar voor die laatste moet ik OPNIEUW de query runnen voor de leerlingen te zoeken die eraan deelgenomen hebben.

Wat ik ook gedacht heb, is gewoon op het scherm een lijst tonen van de leerlingen en dan per leerling een functie oproepen die het punt ophaalt voor die leerling voor die test. HEt nadeel is hiervan dat ik als er 20 lln zijn, ik ook 20 keer een query moet uitvoeren voor het punt te vinden. Das niet zo performant maar wel een gemakkelijke oplossing.
Ik zou het dus liever in1 query hebben.

Iemand enige tips...

Kemblin

Legacy Member
niet echt getest maar zou het niet zoiets kunnen zijn? Of moet ge meer hebben dan enkel alle punten van een test?

SELECT l.naam, p.test_id, p.punt FROM punten AS p LEFT JOIN (SELECT * FROM leerlingen) AS l ON (p.lln_id = l.id) WHERE (p.test_id = 'een test')

passero

Legacy Member
kheb het even geprobeerd en het werkt niet. Ik krijg enkel de leerlingen die effectief hebben deelgenomen.

Kemblin

Legacy Member
gewoon een jointje meer dan?

Code:
SELECT l.naam, p.test_id, p.punt 
FROM punten AS p 
	LEFT JOIN (SELECT * FROM leerlingen) AS l 
	ON (p.lln_id = l.id) 
		LEFT JOIN (SELECT * FROM klas) AS k 
		ON (l.klas_id = k.id) 
WHERE (p.test_id = 'een test') AND (k.naam = 'klas 4')

maar uw vraag is niet echt duidelijk, probeer de query eens duidelijk te formuleren in woorden...
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan