2016-02-14 258 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,但我從來沒有測試過,所以我會離開該位,因爲我知道將工作的方式。 –