SQL: SELECT WHERE COUNT = 1
Table LESSON
a des champs LessonDate, MemberId
(Parmi d'autres que ces deux-là sont pertinentes)
En anglais: Donnez-moi une liste des dates auxquelles les étudiants qui n'ont encore jamais pris le 1er de la classe, ont eu la classe.
J'ai essayé un certain nombre de choses. Voici ma dernière tentative:
SELECT LessonDate
FROM LESSON
WHERE (SELECT COUNT(MemberId) GROUP BY (MemberId)) = 1
Ne cesse de retourner des erreurs SQL. Évidemment, la syntaxe et la logique est à l'arrêt.
- Votre question est d'être marqué vers le bas comme vous ne l'avez pas démontré que vous avez étudié ce problème très bien. Vous pouvez jeter un oeil à Cet article sur la façon de poser des questions et effectuer quelques recherches avant de poster votre question.
- Désolé, j'étais juste en essayant de garder ma question claire et concise. Je pense que c'est un peu injuste, je n'ai fais beaucoup de recherches et d'essayer de nombreuses choses avant de demander, mais j'ai réalisé que je ne savais pas ce dont j'avais besoin pour le faire fonctionner. Dans ce cas, c'est la clause HAVING, que je n'ai jamais vu avant. Vous ne savez pas ce que vous ne savez pas.
Vous devez vous connecter pour publier un commentaire.
La requête peut sembler un peu contre-intuitif au premier abord. Vous avez besoin de regrouper par
MemberId
à amener les élèves qui n'a pris qu'une classe:Car il n'y a qu'une classe de l'élève,
max(l.LessonDate)
est à cette date. Donc ce n'est ce que vous voulez: il obtient toutes les dates pour les membres qui n'a pris qu'une classe.Votre ligne de pensée est également assez proche. Voici la requête que je pense que vous avez été à la recherche pour:
Cette approche est plus générale, si vous souhaitez obtenir des dates pour les membres qui ont 2 ou 3 lignes.
l2
n'est pas nécessairement dans cette requête. Il est appelé un "alias de la table" et est seulement utilisé pour distinguer la table dans la sous-requête de la table dans la requête externe.Vous avez besoin de regarder dans
SELECT ... FROM ... GROUP BY ... HAVING
Il y a beaucoup de documentation disponible en ligne par la rechercheGROUP BY
par exemple Cet articleLe SQL suivant les groupes par
MemberId
qui je thnk est faux que vous souhaitez compter le nombre de membre de l'id,La requête ci-dessus vous donnera une liste de "dates", "membres", et le nombre de leçons prises à cette date par le "membre". Je ne pense pas que vous devez avoir la fonction d'agrégation (
COUNT(*) AS Lesson_Count
) dans le cadre de l'instruction select, mais, il est souvent, "nice to have" pour vous donner la confiance que vos résultats sont comme vous le souhaitez.Votre requête est en fait défaut parce que la sous-requête ne dispose pas d'un
FROM
déclaration, mais le ci-dessus est une meilleure pratique:ou
La suivante devrait fonctionner: