Du kan bara använda aggregerade funktioner som COUNT()
i en HAVING
sats, eller i SELECT
sats när en GROUP BY
är använd. WHERE
satsen fungerar på rader som kommer från FROM
klausul. Ingen aggregering har skett, så det finns inget sätt för de aggregerade funktionerna att vara meningsfulla.
Det ser ut som att det du vill göra är att i tabellen ENROLL hitta alla elever som dyker upp mer än en gång. Då vill du få mer information om de eleverna. Det finns potentiellt många sätt att göra detta, men jag skulle rekommendera en underfråga.
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
Underfrågan där efter JOIN
gör den första beräkningen (vilka elever har flera rader i ENROLL) och producerar i princip en pseudotabell med en lista över student-ID. Eftersom vi gör en inre koppling är det bara rader i STUDENT-tabellen som har en sno
i vår underfråga kommer att dyka upp. Det sköts i princip av ON
klausul.
Eftersom du i en kommentar sa att du vill kunna tillämpa ytterligare villkor på eleverna har jag lagt till i någon exempelkod där det skulle hända. Eftersom den informationen kommer från STUDENT-tabellen kan den göras utanför underfrågan. Du angav inte specifikt vad "äldsta studenter" menade, så jag har bara antagit att du ville ha de 10 äldsta inskrivna i flera kurser. Du bör kunna justera utifrån dina behov.
Låt mig veta om något av detta inte är vettigt så ska jag försöka förklara mer detaljerat.