U kunt alleen statistische functies gebruiken, zoals COUNT()
in een HAVING
clausule, of in de SELECT
clausule wanneer een GROUP BY
is gebruikt. De WHERE
clausule werkt op rijen die afkomstig zijn van de FROM
clausule. Er heeft geen aggregatie plaatsgevonden, dus de aggregatiefuncties kunnen op geen enkele manier zinvol zijn.
Het lijkt erop dat u in de tabel ENROLL alle studenten wilt zoeken die meer dan eens voorkomen. Dan wil je meer informatie over die studenten. Er zijn mogelijk veel manieren om dit te doen, maar ik zou een subquery aanraden.
SELECT s.*
FROM student AS s
JOIN (
SELECT e.sno
FROM enroll AS e
GROUP BY e.sno
HAVING COUNT(*) > 1
) AS e
ON e.sno = s.sno
ORDER BY s.age DESC
LIMIT 10
De subquery daar na JOIN
doet die eerste berekening (welke studenten meerdere rijen hebben in ENROLL) en produceert in feite een pseudo-tabel met een lijst met student-ID's. Aangezien we een inner join doen, alleen rijen in de STUDENT-tabel die een sno
hebben in onze subquery zal verschijnen. Dat wordt in principe verzorgd door de ON
clausule.
Omdat je in een opmerking hebt gezegd dat je aanvullende voorwaarden wilt kunnen stellen aan de studenten, heb ik in een voorbeeldcode toegevoegd waar dat zou gebeuren. Aangezien die informatie uit de STUDENT-tabel komt, kan dit buiten de subquery worden gedaan. Je hebt niet specifiek aangegeven wat 'oudste studenten' bedoelen, dus ik ging er gewoon van uit dat je de 10 oudste wilde inschrijven voor meerdere cursussen. Je zou je moeten kunnen aanpassen op basis van je behoeften.
Laat het me weten als dit niet klopt en ik zal proberen het in meer detail uit te leggen.