Можете да използвате само агрегатни функции като COUNT()
в HAVING
клауза или в SELECT
клауза, когато GROUP BY
се използва. WHERE
клаузата работи върху редове, които идват от FROM
клауза. Не е извършено агрегиране, така че няма начин агрегатните функции да имат смисъл.
Изглежда, че това, което искате да направите, е да намерите от таблицата ЗАПИСАНЕ всички студенти, които се появяват повече от веднъж. Тогава искате да получите повече подробности за тези ученици. Има потенциално много начини да направите това, но бих препоръчал подзаявка.
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
Подзаявката там след JOIN
прави това първо изчисление (които студенти имат няколко реда в РЕГИСТРАЦИЯ) и основно създава псевдотаблица със списък на студентски идентификатори. Тъй като правим вътрешно свързване, само редове в таблицата STUDENT, които имат sno
в нашата подзаявка ще се покаже. За това основно се грижи ON
клауза.
Тъй като казахте в коментар, че искате да можете да прилагате допълнителни условия към учениците, добавих в примерен код, където това ще се случи. Тъй като тази информация идва от таблицата STUDENT, това може да се направи извън подзаявката. Не посочихте конкретно какво означава „най-възрастните ученици“, така че просто предположих, че искате 10-те най-възрастни да бъдат записани в няколко курса. Трябва да можете да коригирате според нуждите си.
Уведомете ме, ако нещо от това няма смисъл и ще се опитам да обясня по-подробно.