Нужно получить отчет о задолженности студентов заданного факультета за заданный курс обучения (эти два выбора потом я добавлю через select в форме, а пока просто самому в запросе менять): ФИО студента, группа, сумма начислений, задолженность по оплате (пока пустым оставим). Студент считается должником, если в ЭТОТ месяц от него не было оплаты. Сейчас имеется вот такой код запроса: PHP: $query= "SELECT FIO_student, group_name, SUM(Total_summ) as Total_pay FROM student INNER JOIN study_group ON (student.ID_group = study_group.ID_group) INNER JOIN payment ON (student.ID_student = payment.ID_student)"; Но этот код работает неверно, точнее, запрос написан не так, как надо для задания. В таблице payment хранится оплата каждый месяц для конкретного студента. Код выше выводит сумма ВСЕХ начислений за ВСЕХ студентов, но как будто это один студент сделал. См. вложение
Спасибо, действительно группирует. Но возникла другая трудность. К примеру, возьмем Достоевского (первая строка). Напомню, в таблицу мы выводим список должников. Достоевскому добавил оплату в ноябре и в декабре. Но все равно его выводит в этой таблице. Причем, не обновляет данные о сумме всех начислений, хотя там сумма перевалила за указанную. Есть мысли из-за чего это может быть? Итоговый запрос теперь выглядит так: PHP: $query= "SELECT FIO_student, group_name, SUM(Total_summ) as Total_pay, ID_payment, Date_payment FROM student INNER JOIN study_group ON (student.ID_group = study_group.ID_group) INNER JOIN payment ON (student.ID_student = payment.ID_student) WHERE date_format(Date_payment, '%Y%m') < date_format(now(), '%Y%m') GROUP BY FIO_student, group_name"; Во вложении сама таблица должников и строки из самой базы данных об оплате
Вообще странности. Пробовал менять данные вручную внутри базы, не обновляет в таблице. Вот код, выводящий ее на экран: PHP: $link = mysqli_connect($host, $user, $password, $database) or die("Ошибка " . mysqli_error($link)); $query= "SELECT FIO_student, group_name, SUM(Total_summ) as Total_pay, ID_payment, Date_payment FROM student INNER JOIN study_group ON (student.ID_group = study_group.ID_group) INNER JOIN payment ON (student.ID_student = payment.ID_student) WHERE date_format(Date_payment, '%Y%m') < date_format(now(), '%Y%m') GROUP BY FIO_student, group_name"; $result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link)); $data = mysqli_fetch_all($result, MYSQLI_ASSOC); echo '<h2>Отчет о задолженности студентов</h2> <table class = "table table-hover table-striped"> <thead class = "thead-inverse thead-dark"> <tr> <th>ФИО студента</th> <th>Группа</th> <th>Сумма начислений</th> <th>Задолженность по оплате</th> </tr> </thead> <tbody>'; foreach ($data as $key => $value) { echo ' <tr> <th scope="row">'.$value['FIO_student'].'</th> <th scope="row">'.$value['group_name'].'</th> <th scope="row">'.$value['Total_pay'].'</th> </tr> '; } echo '</tbody> </table>'; В недоумении сижу, как так?
Попробовал экспериментировать. Если в строке запроса убрать ID_payment, Date_payment и блок WHERE, то все нормально обновляется. Но как все-таки сделать (что добавить), чтобы отображались должники (то есть те, кто НЕ заплатил в текущем месяце)? Вдобавок нужно в WHERE вписать данные от двух кнопок из select (option которые): курс обучения (4 поля) и заданного факультета (несколько полей выбора)
Эти поля у тебя не указаны в группировке, из-за этого результат не тот который ты ожидаешь увидеть. Вообще у тебя по идее должна ошибка падать, потому что поля не участвуют в группировке
Добавил в группировку Date_payment, убрал вовсе ID_payment (ни к чему там). Теперь вот что. Результат все равно не тот. Есть еще мысли?)
Код (Text): SELECT FIO_student, group_name, SUM(Total_summ) as Total_pay FROM student JOIN study_group ON student.ID_group = study_group.ID_group /* подзапрос для получения платежей за текущий месяц */ LEFT JOIN ( Select * From payment p /* можно заменить на EXTRACT(YEAR_MONTH FROM p.Date_payment) = EXTRACT(YEAR_MONTH FROM NOW()) если поддерживает mysql */ Where date_format(p.Date_payment, '%Y%m') = date_format(NOW(), '%Y%m') ) payed ON student.Id_student = payed.Id_student /* проверяем студентов у которых нет платежей */ Where payed.Id_student is null GROUP BY FIO_student, group_name Суммы (задолженность) ты получить не сможешь так как у тебя нет платежей, остальные условия добавишь, запрос рабочий должен быть