2015-06-07 2 views
3

У меня есть две таблицынужно получить все студенты, которые не заплатили за текущий месяц

Студенты стол:

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 - Subquery returns more than 1 row'

Можете ли вы сказать мне, что правильный запрос для извлечения всех студентов, которые не заплатили за текущий месяц?

+0

начать, использовать NOT IN вместо =, также вы можете улучшить запрос !!! – amitchhajer

+0

thx amit..NOT IN работает .. – kodebuilder

ответ

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()))) 
+0

thx много, рабочий :) – kodebuilder

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(). В общем, они обычно будут использоваться вместе, если вы действительно не хотите сочетать месяцы с разных лет.

Также обратите внимание, что оплата или неплатеж за текущий месяц может не отвечать на вопрос. Что, если студент заплатил за текущий месяц, но пропустил платеж за предыдущий месяц?

Смежные вопросы