MySQL: список студентов (Sname), которые зачислены в более чем 6 (отдельных) классов за семестр - PullRequest
0 голосов
/ 28 октября 2010

С учетом схемы:

Student(Snum, Sname)
Course(Cnum, Cname)
Prerequisite(Cnum, Prereq)
Professor(Pnum,Pname, Dept, Office)
Enrollment(Snum, Cnum, Term, Section, Mark)
Schedule(Cnum, Term, Section, Days, Time, Room)
Class(Cnum, Term, Section, Instructor)

Я придумал:

SELECT * FROM Student s
HAVING MIN(
    SELECT COUNT(*) FROM Enrollment e
    WHERE e.Snum = s.Snum
    GROUP BY e.Term
) > 6

Но я получаю:

/ * Ошибка SQL (1064): у вас есть ошибка в вашем синтаксисе SQL; проверить руководство что соответствует вашему серверу MySQL версия для правильного использования синтаксиса около 'ВЫБЕРИТЕ СЧЕТЧИК (*) ИЗ ЗАПИСИ ГДЕ e.Snum = s.Snum GROUP BY e.Term)> 'в строке 3 * /

Есть идеи, как я могу это исправить? Спасибо!

Кроме того, было бы отрадно знать, что у меня правильная логика =)

РЕДАКТИРОВАТЬ: ОКОНЧАТЕЛЬНЫЙ ОТВЕТ ...

SELECT Student.Sname
FROM(
    SELECT COUNT(DISTINCT Cnum) as `classes`, e.Term as `term`, e.Snum as `student`
    FROM Enrollment e
    GROUP BY e.Term, e.Snum
) x
JOIN Student ON Student.Snum = `student`
WHERE x.`classes` > 6

Ответы [ 2 ]

1 голос
/ 28 октября 2010

Если вы хотите увидеть учеников, у которых было по крайней мере 6 классов по каждому семестру:

SELECT * FROM Student s
WHERE (SELECT MIN(perTerm) FROM(
    SELECT COUNT(DISTINCT Cnum) as perTerm FROM Enrollment e
    WHERE e.Snum = s.Snum
    GROUP BY e.Term
)) > 6

Вот, пожалуйста. Вы были почти там, но HAVING нельзя использовать, если у вас нет GROUP BY.

Если вы хотите любой термин, замените MIN на MAX, а если вам нужен конкретный термин, используйте обновленную версию Vegard.


Если двойной подзапрос не работает, попробуйте следующий:

SELECT `student`
FROM(
    SELECT COUNT(DISTINCT Cnum) as `classes`, s.Term as `term`, s.Snum as `student`
    FROM Enrollment e
    GROUP BY e.Term, e.Snum
)
GROUP BY `term`
HAVING MIN(`classes`) > 6
1 голос
/ 28 октября 2010
SELECT * FROM Student s
WHERE (
    SELECT COUNT(*) FROM Enrollment e
    WHERE e.Snum = s.Snum
    AND e.Term = <some term>
) > 6

Здесь нет необходимости использовать агрегатную функцию, поэтому используйте также обычный WHERE (не HAVING) для подзапроса.

Редактировать: изменен, чтобы проверять только один членвремя.Если вам абсолютно необходимо проверить все условия, у меня не будет хорошей идеи.

...