[英]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)
---------------
==================
他们由StudentClasses.StudentID和Students.ID加入。
我正在尝试编写查询以返回注册最少课程的学生。 我的查询是:
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
但是,这只会按ASC顺序返回所有至少有1个班级的学生。
我知道正确的答案是0个班级的7名学生。
如何修改查询以仅返回那7个班级为0的学生。
要招募那些没有班级的学生,而不是INNER JOIN
您应该在这里使用LEFT JOIN
,以确保列出了students
表中的所有行,即使该特定学生的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
这个问题的答案。 如何修改查询以仅返回那7个班级为0的学生。
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.