SQL отображение нескольких записей

#php #mysql

#php #mysql

Вопрос:

В настоящее время я работаю над школьной системой управления расписанием, в которой панель мониторинга учащихся, расписание отображается в соответствии с текущим днем, но при отображении данных из ниоткуда появляются два дубликата.

Первоначально я присоединился к таблицам «учащиеся» и «расписание» с помощью «ВНУТРЕННЕГО СОЕДИНЕНИЯ», но проблема заключалась в том, что дубликаты размещались одновременно, что позже было исправлено с помощью «RIGHT JOIN».

Теперь дубликаты отображаются после печати всей таблицы.

введите описание изображения здесь

ВОТ КОД НИЖЕ:-

 
<?php

require_once("connection.php");

        function information($subject, $time, $day, $teacher){
            $element = "
        
          <tr>
            <td>$subject</td>
            <td>$time</td>
            <td>$day</td>
            <td>$teacher</td>
          </tr>
        ";

        echo $element;
        }

        function getData(){
            global $conn;
            $sql = '
    SELECT DISTINCT students.roll_no
                  , students.class_room
                  , timetable.subject_name
                  , timetable.time_code
                  , timetable.day_otw
                  , timetable.teacher_name
               FROM students
              RIGHT 
               JOIN timetable 
                 ON students.class_room = timetable.room_no;
    ';

            $result = mysqli_query($conn, $sql);
            $mydate=getdate(date("U"));

            if(mysqli_num_rows($result) > 0){
                while($row=mysqli_fetch_assoc($result)){
                  if($mydate['weekday'] == $row['day_otw']){
                    information($row['subject_name'], $row['time_code'], $row['day_otw'], $row['teacher_name']);
                  }
                }
            } else {
                echo "
                <h1 class="check-data">Sorry, You haven't been assigned a class yet!</h1>
                <h3 class="ask">Please contact your teacher/supervisor for more information.</h3>
                ";
            }
        }

        getData();
?>

 

ТАКИМ ОБРАЗОМ, В ОСНОВНОМ ВСЯ ТАБЛИЦА ДУБЛИРУЕТСЯ ДВАЖДЫ.

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

1. Предоставьте фактические сценарии СОЗДАНИЯ ТАБЛИЦ для students и timetable таблиц. Предоставьте некоторые образцы данных и желаемый результат для них. что позже было исправлено с помощью ‘RIGHT JOIN’. Выглядит нелогично.

2. Обратите внимание, что никто никогда не использует RIGHT JOIN

3. На скриншоте нет данных об учениках ( roll_no ). Может ли быть так, что вы показываете расписания для нескольких учеников, таким образом отображая одно и то же расписание снова и снова?

Ответ №1:

Внешнее объединение здесь не имеет смысла. Вам не нужны ни учащиеся без записи расписания ( LEFT OUTER JOIN ), ни записи расписания без учащихся ( RIGHT OUTER JOIN ). Тогда вы используете DISTINCT , потому что вы боретесь с дубликатами, что является плохой идеей, потому что таким образом вы не проверяете, откуда берутся дубликаты. В первую очередь не должно быть дубликатов, поэтому, вероятно, что-то не так с критериями объединения или данными. Вы должны исправить это, а не искать неподходящие обходные пути.

Ваш критерий объединения заключается в том, что учащийся находится в той же комнате, что и запись расписания. Почему ученик связан с комнатой? Все ли занятия учащегося проходят в одной комнате? В этом случае, да, классная комната будет означать класс, и тогда таблицы будут связаны классом (комнатой). Но если бы это было так, вы бы не получили дубликатов.

Я предполагаю, что должно быть что-то еще, чтобы связать студентов с расписанием. Найдите студенческий билет в расписании. Что-то вроде:

 SELECT s.roll_no, s.class_room, t.subject_name, t.time_code, t.day_otw, t.teacher_name
FROM students s
JOIN timetable t ON s.student_id = t.student_id
ORDER BY s.student_id, t.day_otw, t.time_code;
 

Или, может быть, есть что-то вроде дополнительного идентификатора класса, к которому принадлежат как студент, так и расписание? (Однако тогда комната в обеих таблицах выглядела бы странно.) Возможно, вы недостаточно хорошо знаете базу данных. Если это так, спросите кого-нибудь, кто знает.

Ответ №2:

На вашем экране вам нужно только отображать данные расписания, поэтому нет смысла ссылаться на таблицу учащихся

Пожалуйста, рассмотрите возможность использования следующего вместо вашего right join

 SELECT 
timetable.subject_name, timetable.time_code, 
timetable.day_otw, timetable.teacher_name
            FROM timetable