From bcd800d81bbca3fa3a48dfb2d8ba81d4d9d3f6f9 Mon Sep 17 00:00:00 2001 From: PavelBegunkov <asml.Silence@gmail.com> Date: Sun, 8 Feb 2015 16:55:54 +0300 Subject: [PATCH] REF: views almost over --- db/StoredProcedures.sql | 335 +++++++++++++++++++--------------------- db/Views.sql | 1 + 2 files changed, 159 insertions(+), 177 deletions(-) diff --git a/db/StoredProcedures.sql b/db/StoredProcedures.sql index d1e808c33..b00b2ebe2 100644 --- a/db/StoredProcedures.sql +++ b/db/StoredProcedures.sql @@ -1809,7 +1809,7 @@ BEGIN END // - +# TODO: slowpoke DROP PROCEDURE IF EXISTS GetDisciplinesForStudent// CREATE PROCEDURE `GetDisciplinesForStudent`(IN `pStudentID` INT) NO SQL @@ -1818,22 +1818,23 @@ BEGIN view_disciplines.SubjectID, view_disciplines.SubjectName, view_disciplines.ExamType, - view_disciplines_teachers.LastName AS 'Last', - view_disciplines_teachers.FirstName AS 'First', - view_disciplines_teachers.SecondName AS 'Second', + view_teachers.LastName AS 'Last', + view_teachers.FirstName AS 'First', + view_teachers.SecondName AS 'Second', (view_rating_result.RateRegular + view_rating_result.RateExtra + view_rating_result.RateBonus + view_rating_result.RateExam) AS 'Rate', view_disciplines_results.DisciplineRateCur AS 'MaxCurrentRate' # --isMapCreated FROM `view_disciplines_students` INNER JOIN `view_disciplines` ON view_disciplines.DisciplineID = view_disciplines_students.DisciplineID - INNER JOIN `view_disciplines_results` ON view_disciplines_results.DisciplineID = view_disciplines_students.DisciplineID - INNER JOIN `view_rating_result` ON view_rating_result.StudentID = pStudentID AND + LEFT JOIN `view_disciplines_results` ON view_disciplines_results.DisciplineID = view_disciplines_students.DisciplineID + LEFT JOIN `view_rating_result` ON view_rating_result.StudentID = pStudentID AND view_rating_result.DisciplineID = view_disciplines_results.DisciplineID - LEFT JOIN `view_disciplines_teachers` ON view_disciplines_teachers.DisciplineID = view_disciplines.DisciplineID + INNER JOIN `view_teachers` ON view_teachers.TeacherID = view_disciplines.AuthorID WHERE view_disciplines.SemesterID = @CurrentSemesterID AND - view_disciplines_students.StudentID = pStudentID - ORDER BY disciplines.ExamType ASC, view_disciplines.DisciplineID ASC; + view_disciplines_students.StudentID = pStudentID AND + (view_disciplines_students.AttachType IS NULL OR view_disciplines_students.AttachType != 'detach') + ORDER BY view_disciplines.ExamType ASC, view_disciplines.DisciplineID ASC; END // @@ -1843,38 +1844,45 @@ CREATE PROCEDURE `GetMapForStudent` ( IN `pStudentID` INT, IN `pDisciplineID` INT) NO SQL BEGIN - SELECT modules.ID AS 'ModuleID', - modules.Name AS 'ModuleName', - submodules.ID AS 'SubmoduleID', - submodules.Name AS 'SubModuleName', - submodules.Description AS 'SubmoduleDescription', - submodules.MaxRate, - submodules.Type AS 'SubmoduleControl', - rating_table.Rate, - rating_table.Date, - modules.Type AS 'ModuleType' - FROM `submodules` - INNER JOIN `modules` ON submodules.ModuleID = modules.ID AND - pDisciplineID = modules.DisciplineID - LEFT JOIN `rating_table` ON submodules.ID = rating_table.SubmoduleID AND - pStudentID = rating_table.StudentID - - - WHERE modules.Type != 2 OR - submodules.ID = - ( @tmp = (SELECT submodules.ID - FROM `submodules` - INNER JOIN `rating_table` ON rating_table.SubModuleID = submodules.ID - WHERE submodules.ModuleID = modules.ID AND - rating_table.StudentID = pStudentID - ORDER BY submodules.OrderNum DESC - LIMIT 1) - ) OR - (@tmp IS NULL AND submodules.OrderNum = 1) - ORDER BY modules.Type ^ 1 ASC, - # 1, 3, 2, 4 ASC - modules.OrderNum ASC, - submodules.OrderNum ASC; + + # TODO: delview_rating.ModuleOrderNum, view_rating.SubmoduleOrderNum, + # TODO: php time! + (SELECT view_rating.ModuleID, + view_rating.ModuleName, + view_rating.SubmoduleID, + view_rating.SubModuleName, + view_rating.SubmoduleRate AS 'MaxRate', + view_rating.Rate, + view_rating.Date, + view_rating.ModuleOrderNum, + view_rating.SubmoduleOrderNum, + view_rating.ModuleType + FROM `view_rating` + WHERE view_rating.StudentID = pStudentID AND + view_rating.DisciplineID = pDisciplineID AND + view_rating.ModuleType != 'exam' + ) UNION ( + SELECT view_rating.ModuleID, + view_rating.ModuleName, + view_rating.SubmoduleID, + view_rating.SubModuleName, + view_rating.SubmoduleRate AS 'MaxRate', + view_rating.Rate, + view_rating.Date, + view_rating.ModuleOrderNum, + view_rating.SubmoduleOrderNum, + view_rating.ModuleType + FROM `view_rating` + WHERE view_rating.StudentID = pStudentID AND + view_rating.DisciplineID = pDisciplineID AND + view_rating.ModuleType = 'exam' + ORDER BY view_rating.Rate IS NULL ASC, + view_rating.SubmoduleOrderNum DESC + LIMIT 1 + ) ORDER BY ModuleType ^ 1 ASC, + # 1, 3, 2, 4 ASC + ModuleOrderNum ASC, + SubmoduleOrderNum ASC; END // @@ -1884,59 +1892,48 @@ CREATE PROCEDURE `GetMapForStudentExam` ( IN `StudentID` INT, ) NO SQL BEGIN - SELECT modules.ID AS 'ModuleID', - modules.Name AS 'ModuleName', - submodules.ID AS 'SubmoduleID', - submodules.Name AS 'SubModuleName', - submodules.Description AS 'SubmoduleDescription', - submodules.MaxRate, - submodules.Type AS 'SubmoduleControl', - rating_table.Rate, - rating_table.Date, - modules.Type AS 'ModuleType' - FROM `submodules` - INNER JOIN `modules` ON submodules.ModuleID = modules.ID AND - DisciplineID = modules.DisciplineID - LEFT JOIN `rating_table` ON submodules.ID = rating_table.SubmoduleID AND - StudentID = rating_table.StudentID - ORDER BY modules.OrderNum ASC, - submodules.OrderNum ASC; + SELECT view_rating.ModuleID, + view_rating.ModuleName, + view_rating.SubmoduleID, + view_rating.SubModuleName, + view_rating.SubmoduleRate AS 'MaxRate', + view_rating.SubmoduleType AS 'SubmoduleControl', + view_rating.Rate, + view_rating.Date, + view_rating.ModuleType + FROM `view_rating` + WHERE view_rating.StudentID = pStudentID AND + view_rating.DisciplineID = pDisciplineID + ORDER BY view_rating.ModuleOrderNum ASC, + view_rating.SubmoduleOrderNum ASC; END // DROP PROCEDURE IF EXISTS GetMapForDiscipline// CREATE PROCEDURE `GetMapForDiscipline` ( IN `TeacherID` INT, - IN `DisciplineID` INT + IN `pDisciplineID` INT ) NO SQL BEGIN - IF NOT InternalIsTeacherBinded(TeacherID, DisciplineID) - THEN - SELECT NULL AS 'ID' - LIMIT 0; - ELSE - SELECT subjects.ID AS 'SubjectID', - subjects.Name AS 'SubjectName', - modules.ID AS 'ModuleID', - modules.Name AS 'ModuleName', - modules.Type AS 'ModuleType', - submodules.ID AS 'SubmoduleID', - submodules.Name AS 'SubModuleName', - submodules.Description AS 'SubmoduleDescription', - submodules.MaxRate, - submodules.Type AS 'SubmoduleControl' - FROM `modules` - LEFT JOIN `submodules` ON modules.ID = submodules.ModuleID - INNER JOIN `disciplines` ON modules.DisciplineID = disciplines.ID - INNER JOIN `subjects` ON disciplines.SubjectID = subjects.ID - WHERE modules.DisciplineID = DisciplineID AND - (modules.Type != 2 OR submodules.OrderNum = 1) - ORDER BY modules.Type ^ 1 ASC, +# kill first param + SELECT view_disciplines.SubjectID, + view_disciplines.SubjectName, + view_roadmap.ModuleID, + view_roadmap.ModuleName, + view_roadmap.ModuleType, + view_roadmap.SubmoduleID, + view_roadmap.SubmoduleName AS 'SubModuleName', + view_roadmap.SubmoduleRate AS 'MaxRate', + view_roadmap.SubmoduleType AS 'SubmoduleControl' + FROM `view_roadmap` + INNER JOIN `view_disciplines` ON view_disciplines.DisciplineID = pDisciplineID + WHERE view_roadmap.DisciplineID = pDisciplineID AND + (view_roadmap.ModuleType != 'exam' OR view_roadmap.SubmoduleOrderNum = 1) + ORDER BY view_roadmap.ModuleType ^ 1 ASC, # 1, 3, 2, 4 ASC - modules.OrderNum ASC, - submodules.OrderNum ASC; - END IF; + view_roadmap.ModuleOrderNum ASC, + view_roadmap.SubmoduleOrderNum ASC; END // @@ -1946,66 +1943,54 @@ CREATE PROCEDURE `GetMapForDisciplineExam` ( IN `TeacherID` INT, ) NO SQL BEGIN - IF NOT InternalIsTeacherBinded(TeacherID, DisciplineID) - THEN - SELECT NULL AS 'ID' - LIMIT 0; - ELSE - SELECT subjects.ID AS 'SubjectID', - subjects.Name AS 'SubjectName', - modules.ID AS 'ModuleID', - modules.Name AS 'ModuleName', - modules.Type AS 'ModuleType', - submodules.ID AS 'SubmoduleID', - submodules.Name AS 'SubModuleName', - submodules.Description AS 'SubmoduleDescription', - submodules.MaxRate, - submodules.Type AS 'SubmoduleControl' - FROM `modules` - LEFT JOIN `submodules` ON modules.ID = submodules.ModuleID - INNER JOIN `disciplines` ON modules.DisciplineID = disciplines.ID - INNER JOIN `subjects` ON disciplines.SubjectID = subjects.ID - WHERE modules.DisciplineID = DisciplineID AND - (modules.Type = 4 OR modules.Type = 2) - ORDER BY modules.OrderNum ASC, - submodules.OrderNum ASC; - END IF; + + SELECT view_disciplines.SubjectID, + view_disciplines.SubjectName, + view_roadmap.ModuleID, + view_roadmap.ModuleName, + view_roadmap.ModuleType, + view_roadmap.SubmoduleID, + view_roadmap.SubmoduleName AS 'SubModuleName', + view_roadmap.SubmoduleRate AS 'MaxRate', + view_roadmap.SubmoduleType AS 'SubmoduleControl' + FROM `view_roadmap` + INNER JOIN `view_disciplines` ON view_disciplines.DisciplineID = pDisciplineID + WHERE view_roadmap.DisciplineID = DisciplineID AND + (view_roadmap.ModuleType = 'exam' OR view_roadmap.ModuleType = 'extra') + ORDER BY view_roadmap.ModuleType ^ 1 ASC, + # 1, 3, 2, 4 ASC + view_roadmap.ModuleOrderNum ASC, + view_roadmap.SubmoduleOrderNum ASC; END // DROP PROCEDURE IF EXISTS GetDisciplineInfoByID// -CREATE PROCEDURE `GetDisciplineInfoByID`( IN `DiscID` INT ) +CREATE PROCEDURE `GetDisciplineInfoByID`( IN `pDisciplineID` INT ) NO SQL BEGIN - SELECT disciplines.AuthorID, - disciplines.GradeID AS 'GradeID', - grades.Num AS 'GradeNum', - grades.Degree AS 'Degree', - disciplines.ExamType, - disciplines.LectionCount, - disciplines.PracticeCount, - disciplines.LabCount, - disciplines.SemesterID, - subjects.ID AS 'SubjectID', - subjects.Name AS 'SubjectName', - subjects.Abbr AS 'SubjectAbbr', - departments.ID AS 'DepID', - departments.Name AS 'DepName', - faculties.ID AS 'FacultyID', - faculties.Name AS 'FacultyName', - disciplines.isLocked AS 'isLocked', - (modules.ID IS NOT NULL) AS 'isBonus', - disciplines.isMilestone - FROM `disciplines` - INNER JOIN `subjects` ON subjects.ID = disciplines.SubjectID - INNER JOIN `faculties` ON faculties.ID = disciplines.FacultyID - INNER JOIN `teachers` ON disciplines.AuthorID = teachers.ID - INNER JOIN `departments` ON departments.ID = teachers.DepartmentID - INNER JOIN `grades` ON grades.ID = disciplines.GradeID - LEFT JOIN `modules` ON modules.DisciplineID = disciplines.ID AND - modules.Type = 3 - WHERE disciplines.ID = DiscID; + SELECT view_disciplines.AuthorID, + view_disciplines.GradeID, + view_disciplines.GradeNum, + view_disciplines.Degree, + view_disciplines.ExamType, + view_disciplines.LectionCount, + view_disciplines.PracticeCount, + view_disciplines.LabCount, + view_disciplines.SemesterID, + view_disciplines.SubjectID, + view_disciplines.SubjectName, + view_disciplines.SubjectAbbr, + view_disciplines.FacultyID, + view_disciplines.FacultyName, + view_disciplines.isLocked, + view_disciplines.isMilestone, + (modules.ID IS NOT NULL) AS 'isBonus' + FROM `view_disciplines` + LEFT JOIN `modules` ON modules.DisciplineID = view_disciplines.DisciplineID AND + modules.Type = 'bonus' + WHERE view_disciplines.DisciplineID = pDisciplineID + LIMIT 1; END // @@ -2014,59 +1999,55 @@ END // DROP FUNCTION IF EXISTS AddDiscipline// -CREATE FUNCTION `AddDiscipline` ( `TeacherID` INT, - `GradeID` INT, - `SubjectID` INT, - `ExamType` VARCHAR(30) charset utf8, - `LectionCount` INT, - `PracticeCount` INT, - `LabCount` INT, - `FacultyID` INT - ) RETURNS int(11) +CREATE FUNCTION `AddDiscipline` + ( `pTeacherID` INT, `pGradeID` INT, `pSubjectID` INT, + `pExamType` VARCHAR(30) charset utf8, + `pLectionCount` INT, `pPracticeCount` INT, `pLabCount` INT, + `pFacultyID` INT + ) RETURNS int(11) NO SQL BEGIN - DECLARE checker, DisciplineID INT; + DECLARE vChecker, vDisciplineID INT DEFAULT -1; - SET checker = -1; SELECT grades.ID - INTO checker - FROM `grades` - INNER JOIN `faculties` ON FacultyID = faculties.ID - INNER JOIN `subjects` ON SubjectID = subjects.ID - INNER JOIN `teachers` ON TeacherID = teachers.ID - WHERE GradeID = grades.ID - LIMIT 1; - IF checker <= 0 OR - ( ExamType != 'exam' AND ExamType != 'credit') - THEN + INTO vChecker + FROM `grades` + INNER JOIN `subjects_faculties` ON subjects_faculties.SubjectID = pSubjectID AND + subjects_faculties.FacultyID = pFacultyID + INNER JOIN `teachers` ON pTeacherID = teachers.ID + WHERE pGradeID = grades.ID + LIMIT 1; + IF vChecker <= 0 THEN RETURN -1; END IF; INSERT INTO `disciplines` - ( disciplines.AuthorID, - disciplines.GradeID, - disciplines.SubjectID, - disciplines.ExamType, - disciplines.LectionCount, - disciplines.PracticeCount, - disciplines.LabCount, - disciplines.SemesterID, - disciplines.FacultyID - ) - VALUES ( TeacherID, GradeID, SubjectID, ExamType, LectionCount, PracticeCount, LabCount, @CurrentSemesterID, FacultyID ); + ( disciplines.AuthorID, + disciplines.GradeID, + disciplines.SubjectID, + disciplines.ExamType, + disciplines.LectionCount, + disciplines.PracticeCount, + disciplines.LabCount, + disciplines.SemesterID, + disciplines.FacultyID + ) + VALUES ( pTeacherID, pGradeID, pSubjectID, pExamType, + pLectionCount, pPracticeCount, pLabCount, + @CurrentSemesterID, pFacultyID ); - SET DisciplineID = LAST_INSERT_ID(); + SET vDisciplineID = LAST_INSERT_ID(); INSERT INTO `disciplines_teachers` - ( disciplines_teachers.DisciplineID, - disciplines_teachers.TeacherID - ) - VALUES ( DisciplineID, TeacherID ); + ( disciplines_teachers.DisciplineID, + disciplines_teachers.TeacherID + ) + VALUES (vDisciplineID, pTeacherID); IF ExamType = 'exam' THEN - SET checker = AddModuleExam(TeacherID, DisciplineID); + SET vChecker = AddModuleExam(pTeacherID, vDisciplineID); END IF; - SET checker = AddModuleExtra(TeacherID, DisciplineID); - RETURN DisciplineID; + SET vChecker = AddModuleExtra(pTeacherID, vDisciplineID); + RETURN vDisciplineID; END // diff --git a/db/Views.sql b/db/Views.sql index 5b7e22579..92d84cf65 100644 --- a/db/Views.sql +++ b/db/Views.sql @@ -140,6 +140,7 @@ CREATE OR REPLACE VIEW `view_rating` AS INNER JOIN `view_students` ON rating_table.StudentID = view_students.StudentID; + CREATE OR REPLACE VIEW `view_rating_result` AS SELECT view_rating.StudentID, view_rating.DisciplineID, -- GitLab