Du kan kun bruge aggregerede funktioner som COUNT()
i en HAVING
klausul eller i SELECT
klausul når en GROUP BY
anvendes. WHERE
klausul fungerer på rækker, der kommer fra FROM
klausul. Ingen aggregering har fundet sted, så der er ingen måde, hvorpå de aggregerede funktioner kan være meningsfulde.
Det ser ud til, at det, du vil gøre, er at finde alle elever, der optræder mere end én gang fra tabellen TILMELD. Så vil du gerne have flere detaljer om de studerende. Der er potentielt mange måder at gøre dette på, men jeg vil anbefale en underforespørgsel.
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
Underforespørgslen der efter JOIN
udfører den første beregning (hvilke elever har flere rækker i ENROLL) og producerer grundlæggende en pseudo-tabel med en liste over elev-id'er. Da vi laver en indre joinforbindelse, er det kun rækker i STUDENT-tabellen, der har en sno
i vores underforespørgsel vil dukke op. Det er grundlæggende taget hånd om af ON
klausul.
Da du i en kommentar sagde, at du ønsker at kunne anvende yderligere betingelser på eleverne, har jeg tilføjet en eksempelkode, hvor det ville ske. Da disse oplysninger kommer fra STUDENT-tabellen, kan det gøres uden for underforespørgslen. Du sagde ikke specifikt, hvad "ældste studerende" betyder, så jeg har bare antaget, at du ville have de 10 ældste tilmeldt flere kurser. Du bør være i stand til at justere ud fra dine behov.
Fortæl mig, hvis noget af dette ikke giver mening, og jeg vil prøve at forklare mere detaljeret.