2017-04-04 17 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