Страницы

Поиск по вопросам

вторник, 9 октября 2018 г.

Как выводить всех учеников, которые должны произвести оплату?

Пишу на PHP сайт для учета данных, оплаты и посещаемости учеников. Тех, кто приходит к репетитору. В MySQL есть таблица pays, в которую заносится последняя оплата ученика. И есть таблица dates, куда добавляются даты посещения каждого ученика. Оплата производится за 8 занятий Вопрос: никак не могу додуматься, как можно сделать, чтобы выводить всех учеников, которые должны произвести оплату и у которых седьмое или восьмое занятие по счету? И чтобы не исчезало, пока не добавлено в таблицу pays.


Ответ

SELECT dates.user_id FROM dates LEFT JOIN pays ON pays.user_id = dates.user_id WHERE pays.id IS NULL GROUP BY dates.user_id HAVING COUNT(dates.user_id) IN (7,8)
Берем все записи из dates, джойним pays с оплатами, делаем условие того, что оплаты не было произведено, группируем по user_id и смотрим чтобы по пользователю совпадало условие что у него 7 или 8 занятие.
Вы спросили про количество посещений во второй месяц, пока самое простое,что придумал, так это так, получилось конечно как-то помоему колхозно, но ладно.
Выбираем все даты, джойним pays, групируем по user_id, смотрим если кол-во разных дат посещений входит равно 7*кол-ву оплат или 8*кол-во оплат, (кол-во оплат минимум равно 1), то пользователь входит в интервал и его можно предупредить. У pays обязательно должен быть уникальный идентификатор (id), dates обязательно должна иметь дату посещения (date).
SELECT dates.user_id, COUNT(DISTINCT pays.id)+1 pcount FROM dates LEFT JOIN pays ON pays.user_id = dates.user_id GROUP BY dates.user_id HAVING COUNT(DISTINCT dates.date) IN (7*pcount, 8*pcount)
Как короче и эффектнее написать второй, не пришло пока в голову.

Комментариев нет:

Отправить комментарий