Puoi utilizzare solo funzioni aggregate come COUNT()
in un HAVING
clausola, o nella SELECT
clausola quando un GROUP BY
viene usato. Il WHERE
La clausola opera su righe che provengono da FROM
clausola. Non è avvenuta alcuna aggregazione, quindi non è possibile che le funzioni di aggregazione siano significative.
Sembra che quello che vuoi fare sia trovare dalla tabella ENROLL tutti gli studenti che compaiono più di una volta. Quindi vuoi ottenere maggiori dettagli su quegli studenti. Ci sono potenzialmente molti modi per farlo, ma consiglierei una sottoquery.
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
La sottoquery dopo JOIN
esegue il primo calcolo (che gli studenti hanno più righe in ENROLL) e fondamentalmente produce una pseudo-tabella con un elenco di ID studente. Dato che stiamo eseguendo un inner join, solo le righe nella tabella STUDENT che hanno un sno
nella nostra sottoquery apparirà. Questo è fondamentalmente risolto da ON
clausola.
Dato che in un commento hai detto che vuoi essere in grado di applicare condizioni aggiuntive agli studenti, ho aggiunto in alcuni esempi di codice in cui ciò accadrebbe. Poiché tali informazioni provengono dalla tabella STUDENT, possono essere eseguite al di fuori della sottoquery. Non hai specificato specificamente cosa significano "studenti più anziani", quindi ho solo pensato che volessi che i 10 più anziani si iscrivessero a più corsi. Dovresti essere in grado di adattarti in base alle tue esigenze.
Fammi sapere se tutto questo non ha senso e cercherò di spiegarti più in dettaglio.