我在一次采访中遇到了这个问题,我无法完全弄清楚。我有三个表:一个学生表,一个类表和一个链接其他两个表的表。这是它们的基本架构。
STUDENT
student_id | student_name
-----------+-------------
int | varchar(30)
CLASS
class_id | class_name
---------+-----------
int | varchar(30)
ROSTERS
student_id | class_id
-----------+---------
int | int
名册表显示哪些学生正在上哪些课。如何编写查询以显示哪些学生正在上两节或更多课?
答案 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
。
还请注意,JOIN
表class
并不需要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)
您可以使用join
,count
,having
和group 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的最简单方法。