2016-02-14 259 views
0

我的问题是写一个SQL查询返回谁教给其中至少2名学生在使用过程中获得了B-或更好的当然所有教师的姓名。提取数据

我的表是:

Courses(id, name, teacher_id) 
Grades(student_id, course_id, grade) 
Students(id, name, email, password) 
Teachers(id, name) 

我用下面的查询:

SELECT * FROM grades JOIN teachers WHERE grades.grade = 'B-'

但显示了所有老师喜欢

enter image description here

+1

它可能会更容易使用的数值等级值比varchars更高。 '85-89'比编程方式比'b-'或'b'更容易解释。 – chris85

+0

我认为这是它应该存储的方式,因为varchars。 85-89应当在客户端来计算,但没有存储在数据库中,所得到的等级为目的的 – 2016-02-14 09:00:28

回答

2

您可以使用exists()为了检查是否每个老师存在课程,有超过2“B-”或更好

所以您的查询应该是:

SELECT * FROM Teachers t 
WHERE EXISTS(SELECT c.teacher_id from Courses c 
      inner join grades g ON c.id= g.course_id 
      where t.id = c.teacher_id and g.grade in('B-','B','A-','A','A+') 
      group by c.teacher_id having count(*) > 1) 
0

这应该工作:

Select distinct Teachers.name from Courses join Teachers on Courses.teacher_id = Teachers.id where Courses.id in (Select course_id from (Select course_id, count(student_id) as 'total' from Grades where grade = 'B-' or grade = 'B' or grade = 'B+' or grade = 'A-' or grade = 'A' group by course_id) a where a.total > 1) 
+0

2个查询不一定,则可以在具有COUNT(*)> 1,而不是与另一查询它包裹的,并使用其中条款,进一步,如果教师在两个以上的课程,有更多的两名学生授课,他将两次或更多次退换。最后,使用IN(v1,v2,v3)而不是OR,这会减慢进程。 – sagi

+0

是的,我张贴后立即编辑它;我意识到我只有B-。现在它将包括“或更好”。 –

+0

@sagi好点。我没有想到复制老师。我将编辑。我相信你对where子句中有COUNT(*)> 1,但我从来没有测试过,所以我会离开该位,因为我知道将工作的方式。 –