2017-04-04 68 views
0

我有兩個表格:studentspayments選擇在給定期間內未付款的學生(學期)

students有列:

first_name 
last_name 
student_id 
class_name 

payments表有列:

full_name 
student_id 
term 
session 
amount_paid 
class_fee 

每個學生的細節是在students表,但只有那些誰取得了完全或部分付款進入payments表。我寫了一個查詢來選擇那些已經付款的人。

現在的問題是如何編寫一個查詢來選擇特定班級中在給定的時間段(任期內)完全沒有付款的查詢。

+0

SELECT頁*,S * FROM付款p LEFT JOIN學生 ON s.student_id = p.student_id 其中p.amount_paid <= 0和p.term = 'yourcondition'」 –

回答

1

您可能正在使用JOIN來選擇那些已支付。這將起作用,因爲兩個表中都有匹配的行。要找到那些還沒有支付,您可以使用LEFT JOIN。如果行不匹配,它會給你NULL

SELECT students.* 
FROM students 
LEFT JOIN payments ON students.student_id = payments.student_id 
    AND term = 'whatever' 
WHERE amount_paid IS NULL 

(注:term = 'whatever'需要在ON子句中,而不是WHERE

你也可以做到這一點使用子查詢和NOT EXISTS條款。如果子查詢返回零行,則NOT EXISTS將返回true。

SELECT * 
FROM students 
WHERE NOT EXISTS(
    SELECT amount_paid 
    FROM payments 
    WHERE students.student_id = payments.student_id 
     AND term = 'whatever' 
) 
+0

謝謝你非常喜歡Rocket的快速反應,但是學生的課程呢?我想查詢一個給定的班級,比如class1。我應該在最後加上AND class ='$ class1'嗎? – OponjousJoe

+0

@OponjousJoe:'class'是'學生'表的一部分,是的?如果是這樣,那麼是的,應該工作。 –

+0

我很感激,但我想查詢一個班說class1,在一個會話中說2016/2017和在term term first_term。請任何進一步的幫助。 – OponjousJoe