需要获取所有未支付当月费用的学生

时间:2015-06-07 12:22:32

标签: php mysql mysqli

我有两张桌子

学生表:

id   studentname   admissionno
3    test3               3
2    test2               2
1    test                1

第二张表是费用:

id   studentid  created
1       3       2015-06-06 22:55:34
2       2       2015-05-07 13:32:48
3       1       2015-06-07 17:47:46

我需要取出当月没有付款的学生,
我正在执行以下查询:

SELECT studentname FROM students 
    WHERE studentname != (select students.studentname from students
    JOIN submit_fee
    ON (students.id=submit_fee.studentid)
    WHERE MONTH(CURDATE()) = MONTH(submit_fee.created)) ;

我收到错误:

  

'#1242 - 子查询返回超过1行'

你能告诉我正确的查询是什么来取回当天没有付款的所有学生吗?

2 个答案:

答案 0 :(得分:0)

您想使用not existsleft join

select s.*
from students s
where not exists (select 1
                  from studentfees sf
                  where s.id = sf.studentid and
                        sf.created >= date_sub(curdate(), interval day(curdate) - 1) and
                        sf.created < date_add(date_sub(curdate(), interval day(curdate) - 1), 1 month)
                 )

注意仔细构造日期算术。所有功能都在curdate()而非created。这允许MySQL使用where子句的索引(如果合适)。您的查询中的一个错误是使用MONTH()而不使用YEAR()。一般来说,这两者通常会一起使用,除非你真的想要结合不同年份的月份。

此外,请注意,支付或不支付当月可能无法真正回答问题。如果学生在当月支付但错过了上个月的付款怎么办?

答案 1 :(得分:0)

请勿使用,请尝试以下查询:

SELECT s.*
FROM students s
WHERE s.id NOT IN ( SELECT sf.studentid FROM studentfees sf WHERE month(sf.created) = EXTRACT(month FROM (NOW())) )