#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