За последние 24 часа нас посетили 22789 программистов и 1142 робота. Сейчас ищут 718 программистов ...

Нужна помощь с запросом к базе данных

Тема в разделе "Сделайте за меня", создана пользователем lordconst, 12 дек 2019.

  1. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Нужно получить отчет о задолженности студентов заданного факультета за заданный курс обучения (эти два выбора потом я добавлю через select в форме, а пока просто самому в запросе менять): ФИО студента, группа, сумма начислений, задолженность по оплате (пока пустым оставим). Студент считается должником, если в ЭТОТ месяц от него не было оплаты.
    Сейчас имеется вот такой код запроса:
    PHP:
    1. $query= "SELECT FIO_student, group_name, SUM(Total_summ) as Total_pay
    2.        FROM student
    3.        INNER JOIN study_group ON (student.ID_group = study_group.ID_group)
    4.        INNER JOIN payment ON (student.ID_student = payment.ID_student)";
    Но этот код работает неверно, точнее, запрос написан не так, как надо для задания. В таблице payment хранится оплата каждый месяц для конкретного студента. Код выше выводит сумма ВСЕХ начислений за ВСЕХ студентов, но как будто это один студент сделал.
    См. вложение
     

    Вложения:

  2. SProx

    SProx Активный пользователь

    С нами с:
    5 сен 2016
    Сообщения:
    34
    Симпатии:
    6
    Код (Text):
    1. GROUP BY FIO_student, group_name
    ну и дату в условии нужно проверять
     
    #2 SProx, 12 дек 2019
    Последнее редактирование: 12 дек 2019
  3. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Спасибо, действительно группирует. Но возникла другая трудность.
    К примеру, возьмем Достоевского (первая строка). Напомню, в таблицу мы выводим список должников. Достоевскому добавил оплату в ноябре и в декабре. Но все равно его выводит в этой таблице. Причем, не обновляет данные о сумме всех начислений, хотя там сумма перевалила за указанную.
    Есть мысли из-за чего это может быть?
    Итоговый запрос теперь выглядит так:
    PHP:
    1. $query= "SELECT FIO_student, group_name, SUM(Total_summ) as Total_pay, ID_payment, Date_payment
    2.        FROM student
    3.        INNER JOIN study_group ON (student.ID_group = study_group.ID_group)
    4.        INNER JOIN payment ON (student.ID_student = payment.ID_student)
    5.        WHERE date_format(Date_payment, '%Y%m') < date_format(now(), '%Y%m')
    6.        GROUP BY FIO_student, group_name";
    Во вложении сама таблица должников и строки из самой базы данных об оплате
     

    Вложения:

  4. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Вообще странности. Пробовал менять данные вручную внутри базы, не обновляет в таблице.
    Вот код, выводящий ее на экран:
    PHP:
    1. $link = mysqli_connect($host, $user, $password, $database) or die("Ошибка " . mysqli_error($link));
    2. $query= "SELECT FIO_student, group_name, SUM(Total_summ) as Total_pay, ID_payment, Date_payment
    3.        FROM student
    4.        INNER JOIN study_group ON (student.ID_group = study_group.ID_group)
    5.        INNER JOIN payment ON (student.ID_student = payment.ID_student)
    6.        WHERE date_format(Date_payment, '%Y%m') < date_format(now(), '%Y%m')
    7.        GROUP BY FIO_student, group_name";
    8. $result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));
    9. $data = mysqli_fetch_all($result, MYSQLI_ASSOC);
    10. echo '<h2>Отчет о задолженности студентов</h2>
    11.    <table class = "table table-hover table-striped">
    12.        <thead class = "thead-inverse thead-dark">
    13.            <tr>
    14.                <th>ФИО студента</th>
    15.                <th>Группа</th>
    16.                <th>Сумма начислений</th>
    17.                <th>Задолженность по оплате</th>
    18.            </tr>
    19.        </thead>
    20.        <tbody>';
    21.             foreach ($data as $key => $value) {
    22.                 echo '
    23.                <tr>
    24.                    <th scope="row">'.$value['FIO_student'].'</th>
    25.                    <th scope="row">'.$value['group_name'].'</th>
    26.                    <th scope="row">'.$value['Total_pay'].'</th>
    27.                </tr>
    28.                ';
    29.             }
    30.         echo '</tbody>
    31.    </table>';
    В недоумении сижу, как так?
     
  5. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Попробовал экспериментировать. Если в строке запроса убрать ID_payment, Date_payment и блок WHERE, то все нормально обновляется.
    Но как все-таки сделать (что добавить), чтобы отображались должники (то есть те, кто НЕ заплатил в текущем месяце)?
    Вдобавок нужно в WHERE вписать данные от двух кнопок из select (option которые): курс обучения (4 поля) и заданного факультета (несколько полей выбора)
     
  6. SProx

    SProx Активный пользователь

    С нами с:
    5 сен 2016
    Сообщения:
    34
    Симпатии:
    6
    Эти поля у тебя не указаны в группировке, из-за этого результат не тот который ты ожидаешь увидеть.

    Вообще у тебя по идее должна ошибка падать, потому что поля не участвуют в группировке
     
    #6 SProx, 12 дек 2019
    Последнее редактирование: 12 дек 2019
  7. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Добавил в группировку Date_payment, убрал вовсе ID_payment (ни к чему там). Теперь вот что. Результат все равно не тот.
    Есть еще мысли?)
     

    Вложения:

  8. SProx

    SProx Активный пользователь

    С нами с:
    5 сен 2016
    Сообщения:
    34
    Симпатии:
    6
    Код (Text):
    1. SELECT FIO_student, group_name, SUM(Total_summ) as Total_pay
    2. FROM student
    3.     JOIN study_group ON student.ID_group = study_group.ID_group
    4.     /* подзапрос для получения платежей за текущий месяц */
    5.     LEFT JOIN (
    6.         Select *
    7.         From payment p
    8.         /* можно заменить на
    9.             EXTRACT(YEAR_MONTH FROM p.Date_payment) = EXTRACT(YEAR_MONTH FROM NOW())
    10.             если поддерживает mysql
    11.         */
    12.         Where date_format(p.Date_payment, '%Y%m') = date_format(NOW(), '%Y%m')
    13.     ) payed ON student.Id_student = payed.Id_student
    14. /* проверяем студентов у которых нет платежей */
    15. Where payed.Id_student is null
    16. GROUP BY FIO_student, group_name
    Суммы (задолженность) ты получить не сможешь так как у тебя нет платежей, остальные условия добавишь, запрос рабочий должен быть
     
    #8 SProx, 12 дек 2019
    Последнее редактирование: 12 дек 2019
  9. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328