Задавайте вопросы, мы ответим
Вы не зашли.
Доброе время суток.
Есть 3 таблицы:
table1
ID, Date, StudyPlan_ID, Lesson_1, Lesson_1_Lecturer, Lesson_2, Lesson_2_Lecturer, ..., Lesson_8, Lesson_8_Lecturer
table2
ID, Name, Department_ID
table3
ID, Name, Department_ID
Lesson_{N} это индекс и внешний ключ для связи с таблицей table2
Lesson_{N}_Lecturer это индекс и внешний ключ для связи с таблицей table3
В таблице table1 ~200 000 записей. В таблице table2 ~500 записей, В таблице table3 ~500 записей.
Нужно вместо Lesson_{N} выбирать Name из таблицы table2. Для Lesson_{N}_Lecturer то же самое.
JOIN сделать не получается, из-за того, что в table1 есть более одного индекса, относящегося к таблицам table2 и table3. Поэтому приходится через вложенные запросы.
SELECT sh.ID,sh.Date,sh.StudyPlan_ID,
sh.Lesson_1,(SELECT s.Name FROM table2 AS s WHERE s.ID=sh.Lesson_1) AS Lesson_1_Name,
sh.Lesson_1_Lecturer,
(SELECT l.Name FROM table3 AS l WHERE l.ID=sh.Lesson_1_Lecturer) AS Lesson_1_LecturerName,
sh.Lesson_2,(SELECT s.Name FROM table2 AS s WHERE s.ID=sh.Lesson_2) AS Lesson_2_Name,
sh.Lesson_2_Lecturer,
(SELECT l.Name FROM table3 AS l WHERE l.ID=sh.Lesson_2_Lecturer) AS Lesson_2_LecturerName,
sh.Lesson_3,(SELECT s.Name FROM table2 AS s WHERE s.ID=sh.Lesson_3) AS Lesson_3_Name,
sh.Lesson_3_Lecturer,
(SELECT l.Name FROM table3 AS l WHERE l.ID=sh.Lesson_3_Lecturer) AS Lesson_3_LecturerName,
...
sh.Lesson_8,(SELECT s.Name FROM table2 AS s WHERE s.ID=sh.Lesson_8) AS Lesson_8_Name,
sh.Lesson_8_Lecturer,
(SELECT l.Name FROM table3 AS l WHERE l.ID=sh.Lesson_8_Lecturer) AS Lesson_8_LecturerName,
FROM table1 AS sh
WHERE
sh.Date >= ?StartDate AND sh.Date <= ?EndDate AND StudyPlan_ID = ?ID
Можно ли как-то оптимизировать этот запрос?
Неактивен
Не понял, почему нельзя сделать через JOIN. Оптимизировать можно, написав
запрос через него, собственно.
Ну и названия таблиц неудачные.
Неактивен
Названия таблиц shedule, subjects, lecturers
table{N} - это псевдоназвания.
А можно пример, как через JOIN написать? Я не совсем понимаю.
SELECT s1.Name,s2.Name
FROM shedule AS sh
LEFT JOIN subjects AS s1 ON s1.ID=sh.Lesson_1
LEFT JOIN subjects AS s2 ON s2.ID=sh.Lesson_2
Так?
Неактивен
Ну да, например, так.
А еще можно нормализовать первую табличку (чтобы не было этих страшных Lesson_),
и перейти на обычные внутренние JOIN. И тогда наступит мир и счастье
Неактивен
А что посоветуете, кроме как:
ID,Date,StudyPlan_ID,LessonNum,Lesson_Id,Lecturer_Id
где LessonNum это {1-8}, а Lesson_Id и Lecturer_Id то же самое что и Lesson_{N} и Lesson_{N}_Lecturer
Получается, что кол-во записей в таблице увеличится в 8 раз (в худшем случае, если все 8 пар Lesson_Id и Lecturer_Id не null)
Неактивен
Но записи при этом станут короче, запросы будут проще и понятнее, а
в случае появления девятой лекции, ее будет куда вписать
Неактивен
Да, точно! Спасибо Так и сделаю
Неактивен