#php #mysql #database
#php #mysql #База данных
Вопрос:
У меня есть три таблицы: Student, StudentClass и Class table. В таблице Student отображается информация о студентах, в таблице class отображаются классы, которые проводятся в университете, а таблица StudentClass связывает студентов с их классами. Проблема в том, что если я создаю запрос, я получаю повторяющиеся строки в запросе, если я объединяю все три таблицы. Итак, мой вопрос заключается в том, правильно ли я создаю подобную базу данных для учащихся и классов с этими тремя таблицами или есть более эффективный и лучший способ сделать это. Есть и другие таблицы, но я хочу, чтобы вы просто сосредоточились на этих трех таблицах. Спасибо
Ниже приведены таблицы:
Student Table:
StudentId(PK) StudentForename StudentSurname Year StudentUsername CourseId(FK)
S1 Mayur Patel 3 u0867587 INFO101
S2 Jim Carlton 3 u1231231 INFO101
S3 Ahmed Seedat 3 u0660663 INFO101
S4 Amar Barot 3 u0954857 INFO101
S5 Richard Davies 3 u0877223 INFO101
StudentClass Table:
ClassId(PK) StudentId(PK)
101 S1
102 S3
103 S1
104 S2
Class Table:
ClassId(PK) Room ClassDay ClassTime ModuleId(FK) CourseId(FK) TeacherId(FK)
101 CW4/10 Thursday 10:00:00 CHI2550 INFO101 T1
102 CW5/01 Wednesday 12:00:00 CHI2565 INFO101 T5
103 CW2/04 Monday 15:00:00 CHT2520 INFO101 T2
104 CW4/10 Thursday 11:00:00 CHI2550 INFO101 T1
Запрос ниже: (ТАМ, ГДЕ ПРЕДЛОЖЕНИЕ ПРОСТО ИЩЕТ ДАННЫЕ, ВВЕДЕННЫЕ В ТЕКСТОВЫЕ ПОЛЯ ИЗ ФОРМЫ)
SELECT * FROM Module m
INNER JOIN Class cl ON m.ModuleId = cl.ModuleId
JOIN Teacher t ON cl.TeacherId = t.TeacherId
JOIN Session s ON m.ModuleId = s.ModuleId
JOIN Grade_Report gr ON s.SessionId = gr.SessionId
JOIN Student st ON gr.StudentId = st.StudentId
JOIN Course c ON st.CourseId = c.CourseId
WHERE
('".mysql_real_escape_string($sessionid)."' = '' OR gr.SessionId = '".mysql_real_escape_string($sessionid)."')
AND
('".mysql_real_escape_string($moduleid)."' = '' OR s.ModuleId = '".mysql_real_escape_string($moduleid)."')
AND
('".mysql_real_escape_string($courseid)."' = '' OR c.CourseId = '".mysql_real_escape_string($courseid)."')
AND
('".mysql_real_escape_string($classid)."' = '' OR cl.ClassId = '".mysql_real_escape_string($classid)."')
AND
('".mysql_real_escape_string($teacherid)."' = '' OR t.TeacherUsername = '".mysql_real_escape_string($teacherid)."')
AND
('".mysql_real_escape_string($studentid)."' = '' OR st.StudentUsername = '".mysql_real_escape_string($studentid)."')
AND
('".mysql_real_escape_string($year)."' = '' OR st.Year = '".mysql_real_escape_string($year)."')
AND
('".mysql_real_escape_string($grade)."' = '' OR gr.Grade = '".mysql_real_escape_string($grade)."')
Комментарии:
1. Отправьте запрос; это поможет.
2. Используете ли вы первичные ключи, которые видны в реальном мире? Например, возможно ли, что другой класс будет иметь идентификатор
101
в следующем году?3. Извините, забыл нажать ctrl и K для запроса
4. Учитель может отредактировать класс 101 на следующий год, если, скажем, в другой день следующего года, но в то же время и с тем же учителем, например.
5. В вашем запросе намного больше трех таблиц. Я бы подумал о том, что вы делаете более тщательно.
Ответ №1:
Ваша схема выглядит нормально, но ваш запрос намного сложнее, чем необходимо. Попробуйте следующее:
select *
from Student s, Class c, StudentClass sc
where s.StudentId = sc.StudentId
and c.ClassId = sc.ClassId
Внутренние соединения неявны в этом запросе; он должен дать вам четыре строки, соответствующие строкам в StudentClass
. Обратите внимание, что вы увидите Маюра Пателя дважды: один раз в CHI2550 в четверг и один раз в CHT2520 в понедельник.
Если вам нужна другая фильтрация на основе полей формы, это будут просто дополнительные and
предложения.
Ответ №2:
Ваш запрос будет выглядеть примерно так:
select *
from Student as s
left join
StudentClass as sc
on
s.StudentId = sc.StudentId
right join
Class as c
on
sc.ClassId = c.ClassId
Комментарии:
1. Хорошо, тогда спасибо за запрос, но подходят ли таблицы для базы данных учащихся / классов? Если это так, я могу продолжить работу с этими тремя таблицами, если нет, то при необходимости я внесу незначительные изменения
2. Как указывалось ранее, это классическая схема «многие ко многим». В этих таблицах нет ничего плохого, но есть проблема с отправленным вами запросом. Ваши цели не ясны.