2010-10-28 10 views
0

Étant donné le schéma:MySQL: Liste des étudiants (SNAME) qui se sont inscrits dans plus de 6 (distincts) des classes dans un terme

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) 

Je suis venu avec:

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

Mais je suis obtenir:

/* Erreur SQL (1064): Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version serveur MySQL pour la bonne syntaxe à utiliser près de 'SELECT COUNT (*) FROM Inscription e OÙ e.Snum = s.Snum GROUP BY e.Term)>' à la ligne 3 */

Une idée de comment je peux résoudre ce problème? Merci!

En outre, il serait rassurant de savoir que j'ai la logique droite =)

EDIT: La réponse finale ...

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 

Répondre

1

Si vous voulez voir les étudiants qui avaient au moins 6 classes dans chaque terme:

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 

vous allez ici. Vous étiez presque là, mais HAVING ne peut pas être utilisé si vous n'avez pas de GROUP BY.

Si vous voulez tout terme remplacer MIN avec MAX et si vous voulez une utilisation à long terme spécifique, la version mise à jour de Vegard.


Si la double sous-requête ne fonctionne pas, essayez celui-ci:

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 
+0

après avoir ajouté «x» après le de, car il nécessite un alias, je reçois: "/ * Erreur SQL (1054): Colonne inconnue 's.Snum' dans 'where clause' */" – Garrett

+0

Voir la réponse éditée. –

+0

Merci! Edité un peu (comme enlever min et changer à où) ainsi que sélectionner le Sname à la fin pour ce dont j'avais besoin. Tu gères! – Garrett

1
SELECT * FROM Student s 
WHERE (
    SELECT COUNT(*) FROM Enrollment e 
    WHERE e.Snum = s.Snum 
    AND e.Term = <some term> 
) > 6 

Pas besoin d'utiliser une fonction d'agrégation ici, utilisez donc un WHERE normal (pas HAVING) pour la sous-requête. Editer: modifié pour ne vérifier qu'un seul terme à la fois. Si vous devez absolument vérifier tous les termes, je n'ai pas immédiatement une bonne idée.

+0

Faites attention. La sous-requête retournera un ensemble pas un seul élément. Vous devez également calculer le MIN de cet ensemble. –

+0

oui, je dois vérifier chaque terme jusqu'à ce que je trouve 1 ou aucun pour chaque étudiant avec> 6 classes – Garrett