如何编写带计数的查询

How to write a query with count

我有两个表如下:

==================
StudentsClasses  
----------------
ID (Registration ID of the class)
StudentID (ID of student taking class)
ClassID (ID of certain class)
----------------
==================

Students
---------------
ID (ID of student)
Name (Name of student)
GradeLevelID (Grade of student)
---------------
==================

StudentsClasses.StudentID 和 Students.ID 加入了他们。

我正在尝试向 return 注册人数最少 class 的学生写一个查询。我的查询是:

SELECT Students.Name, COUNT(StudentsClasses.StudentID) AS Expr1
FROM     StudentsClasses INNER JOIN
                  Students ON StudentsClasses.StudentID = Students.ID
GROUP BY StudentsClasses.StudentID, Students.Name
ORDER BY Expr1

但是,只有 return 所有学生的 ASC 顺序至少为 1 class。

我知道正确答案是 7 名学生 0 classes.

我怎样才能将我的查询修改为 return 只有那 7 名学生有 0 classes。

要招募那些没有 类 的学生,您应该在此处使用 LEFT JOIN 而不是 INNER JOIN,以确保来自 students [=列出了 20=],即使 studentclasses 中没有该特定学生的行。

SELECT
 s.name, count(sc.id) AS classes
FROM
 students s
 LEFT JOIN studentsclasses sc ON s.id = sc.studentid
GROUP BY s.name
HAVING count(sc.id) = 0 -- added after comment
ORDER BY count(sc.id);

或另一种方法(仅检索具有 0 类 的学生):

SELECT
 s.name
FROM
 students.s
 LEFT JOIN studentsclasses sc ON s.id = sc.studentid
WHERE
 sc.id IS NULL

这应该将您的结果限制为那些拥有最小注册人数 类 的学生(因此,如果当前最小注册人数为零,则为零,如果最少注册人数为 3 , 然后它将使用 3, 等等)

select      s.name,
            v.classes
from        students s
       join (
                select      s.name,
                            count(sc.id) as classes
                from        students s
                  left join studentsclasses sc
                         on s.id = sc.studentid
                group by    s.name
                order by    count(sc.id)
                limit 1
            ) v
         on s.name = v.name

这个问题的答案。 我怎样才能将我的查询修改为 return 只有 0 类.

的那 7 名学生
SELECT
 s.name, count(sc.id) AS classes
FROM
 students s
 LEFT JOIN studentsclasses sc ON s.id = sc.studentid
where (SELECT count(sc.id) FROM
 students s
 LEFT JOIN studentsclasses sc ON s.id = sc.studentid)=0 
GROUP BY s.name
ORDER BY count(sc.id);