我有两张桌子
学生表:
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行'
你能告诉我正确的查询是什么来取回当天没有付款的所有学生吗?
答案 0 :(得分:0)
您想使用not exists
或left 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())) )