Możesz używać tylko funkcji agregujących, takich jak COUNT()
w HAVING
lub w SELECT
klauzula, gdy GROUP BY
jest używany. WHERE
klauzula działa na wierszach pochodzących z FROM
klauzula. Nie miała miejsca agregacja, więc nie ma możliwości, aby funkcje agregujące były znaczące.
Wygląda na to, że chcesz znaleźć w tabeli ENROLL wszystkich uczniów, którzy pojawiają się więcej niż raz. Następnie chcesz uzyskać więcej szczegółów na temat tych uczniów. Potencjalnie można to zrobić na wiele sposobów, ale polecam podzapytanie.
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
Podzapytanie po JOIN
wykonuje to pierwsze obliczenie (które studenci mają wiele wierszy w ENROLL) i zasadniczo tworzy pseudo-tabelę z listą identyfikatorów studentów. Ponieważ robimy sprzężenie wewnętrzne, tylko wiersze w tabeli STUDENT, które mają sno
w naszym podzapytaniu pojawi się. Zajmuje się tym w zasadzie ON
klauzula.
Ponieważ powiedziałeś w komentarzu, że chcesz mieć możliwość zastosowania dodatkowych warunków wobec uczniów, dodałem przykładowy kod, w którym to się stanie. Ponieważ te informacje pochodzą z tabeli STUDENT, można to zrobić poza podzapytaniem. Nie sprecyzowałeś, co konkretnie oznaczają „najstarsi studenci”, więc założyłem, że chcesz, aby 10 najstarszych uczniów zapisało się na wiele kursów. Powinieneś być w stanie dostosować się do swoich potrzeb.
Daj mi znać, jeśli coś z tego nie ma sensu, a postaram się wyjaśnić bardziej szczegółowo.