SQL-查找参加2个或更多课程的学生

时间:2018-12-12 05:06:34

标签: mysql sql

我在一次采访中遇到了这个问题,我无法完全弄清楚。我有三个表:一个学生表,一个类表和一个链接其他两个表的表。这是它们的基本架构。

STUDENT
student_id | student_name
-----------+-------------
int        | varchar(30)

CLASS
class_id | class_name
---------+-----------
int      | varchar(30)

ROSTERS
student_id | class_id
-----------+---------
int        | int

名册表显示哪些学生正在上哪些课。如何编写查询以显示哪些学生正在上两节或更多课?

5 个答案:

答案 0 :(得分:2)

此查询将执行您想要的操作:

SELECT s.student_name, COUNT(DISTINCT r.class_id) AS num_classes
FROM student s
LEFT JOIN rosters r ON r.student_id = s.student_id
GROUP BY s.student_id
HAVING num_classes >= 2

它为每个学生(class_id)计算roster中所有不同的num_classes值,并仅返回2个或更多的学生(HAVING num_classes >= 2)。

请注意,我已经使用LEFT JOIN来吸引所有学生,但是由于您只希望那些班级超过1个的学生,所以这不是必须的,您可以直接使用JOIN

还请注意,JOINclass并不需要git fetch origin remote_branch_name ,但是,如果您想知道学生要参加的课程的名称,则需要。

答案 1 :(得分:1)

这将起作用:

select  s.*,r.*,c.*,count(*) 
from 
student s,
class c,
rosters r where
s.student_id=r.student_id and
c.class_id=r.class_id
group by s.student_id 
having count(*)>=2

答案 2 :(得分:1)

您可以使用joincounthavinggroup by来获得所需的输出:

select r.student_id,s.student_name,count(*) 
from STUDENT s inner join ROSTERS r
on s.student_id = r.student_id
group by r.student_id,s.student_name
having count(*)>=2;

答案 3 :(得分:1)

您需要连接两个表STUDENT和ROSTERS(我使用了内部连接,如果需要,可以根据要求进行更改),计算每个学生参加的课程数量。

SELECT s.student_name, 
    COUNT(r.class_id) AS count
FROM 
    STUDENT s
INNER JOIN 
    ROSTERS r 
ON 
    r.student_id = s.student_id
GROUP BY 
    s.student_id
HAVING 
    count >= 2

答案 4 :(得分:1)

SELECT COUNT(class_id), student_id 
FROM Rosters 
GROUP BY student_id 
HAVING COUNT(class_id) >=2 

这是执行IMO的最简单方法。