From 9afa1f2969b61e6ee40abf0b08de395c52cb7fc3 Mon Sep 17 00:00:00 2001 From: PavelBegunkov <asml.Silence@gmail.com> Date: Sat, 7 Feb 2015 00:06:14 +0300 Subject: [PATCH] REF: sql, still alive --- db/StoredProcedures.sql | 1226 ++++++++++++++++++--------------------- db/Views.sql | 22 +- 2 files changed, 584 insertions(+), 664 deletions(-) diff --git a/db/StoredProcedures.sql b/db/StoredProcedures.sql index 95f008e62..d1e808c33 100644 --- a/db/StoredProcedures.sql +++ b/db/StoredProcedures.sql @@ -16,7 +16,7 @@ DELIMITER // # "SetRate" stored procedure can change isLocked flag DROP FUNCTION IF EXISTS InternalIsMapLocked// CREATE FUNCTION `InternalIsMapLocked` -(`disciplineID` INT) RETURNS boolean + (`disciplineID` INT) RETURNS boolean NO SQL BEGIN DECLARE checker INT DEFAULT -1; @@ -33,7 +33,7 @@ END // # check, that student really take this course DROP FUNCTION IF EXISTS InternalIsStudentAttached// CREATE FUNCTION `InternalIsStudentAttached` -(`StudentID` INT, `DisciplineID` INT) RETURNS boolean + (`StudentID` INT, `DisciplineID` INT) RETURNS boolean NO SQL BEGIN DECLARE checker boolean; @@ -676,7 +676,7 @@ BEGIN FROM `view_study_groups` WHERE view_study_groups.GradeID = pGradeID AND view_study_groups.FacultyID = pFacultyID - ORDER BY study_groups.GroupNum ASC; + ORDER BY view_study_groups.GroupNum ASC; END // @@ -694,7 +694,7 @@ BEGIN view_study_groups.SpecName, view_study_groups.SpecAbbr FROM `disciplines_groups` - INNER JOIN `view_study_groups` ON disciplines_groups.GroupID = view_study_groups.GroupID + INNER JOIN `view_study_groups` ON disciplines_groups.StudyGroupID = view_study_groups.GroupID WHERE disciplines_groups.DisciplineID = pDisciplineID ORDER BY view_study_groups.GradeID ASC, view_study_groups.GroupID ASC; END // @@ -705,18 +705,17 @@ CREATE PROCEDURE `GetStudyGroupsForDisciplineFull` (IN `pDisciplineID` INT) NO SQL BEGIN SELECT DISTINCT - # select all students and collapse all groups - view_study_groups.GroupID AS 'ID', - view_study_groups.GroupNum, - view_study_groups.GradeID, - view_study_groups.GradeNum, - view_study_groups.Degree, - view_study_groups.SpecID, - view_study_groups.SpecName, - view_study_groups.SpecAbbr + view_disciplines_students.GroupID AS 'ID', + view_disciplines_students.GroupNum, + view_disciplines_students.GradeID, + view_disciplines_students.GradeNum, + view_disciplines_students.Degree, + view_disciplines_students.SpecID, + view_disciplines_students.SpecName, + view_disciplines_students.SpecAbbr FROM `view_disciplines_students` WHERE view_disciplines_students.DisciplineID = pDisciplineID - ORDER BY view_disciplines_students.GradeID ASC, view_disciplines_students.GroupNum ASC; + ORDER BY view_disciplines_students.GradeID ASC, view_disciplines_students.GroupID ASC; END // @@ -963,144 +962,137 @@ END // DROP FUNCTION IF EXISTS ChangePassword// -CREATE FUNCTION `ChangePassword` ( `UserID` INT, - `Password` VARCHAR(255) CHARSET utf8 - ) RETURNS int(11) +CREATE FUNCTION `ChangePassword` + ( `pUserID` INT, `pPassword` VARCHAR(255) CHARSET utf8 + ) RETURNS int(11) NO SQL BEGIN - DECLARE checker INT; - - IF Password IS NULL THEN - RETURN -1; - END IF; + DECLARE vChecker INT DEFAULT -1; # check account with UserID - SET checker = -1; SELECT accounts.ID - INTO checker - FROM `accounts` - WHERE accounts.ID = UserID - LIMIT 1; - IF checker <= 0 THEN + INTO vChecker + FROM `accounts` + WHERE accounts.ID = pUserID + LIMIT 1; + IF vChecker <= 0 OR pPassword IS NULL THEN RETURN -1; END IF; # set new password UPDATE `accounts` - SET accounts.Password = Password - WHERE accounts.ID = UserID - LIMIT 1; + SET accounts.Password = pPassword + WHERE accounts.ID = pUserID + LIMIT 1; RETURN 0; END // DROP FUNCTION IF EXISTS ChangeLogin// -CREATE FUNCTION `ChangeLogin` ( `UserID` INT, - `Login` VARCHAR(50) CHARSET utf8 - ) RETURNS int(11) +CREATE FUNCTION `ChangeLogin` + ( `pUserID` INT, `pLogin` VARCHAR(50) CHARSET utf8 + ) RETURNS int(11) NO SQL BEGIN - DECLARE checker INT; + DECLARE vChecker INT DEFAULT -1; # check for account with UserID - SET checker = -1; SELECT accounts.ID - INTO checker - FROM `accounts` - WHERE accounts.ID = UserID - LIMIT 1; - IF checker <= 0 THEN + INTO vChecker + FROM `accounts` + WHERE accounts.ID = pUserID + LIMIT 1; + IF vChecker <= 0 THEN RETURN -1; END IF; # search accounts with Login (login must be unique) - SET checker = -1; + SET vChecker = -1; SELECT accounts.ID - INTO checker - FROM `accounts` - WHERE accounts.Login = Login - LIMIT 1; - IF checker > 0 THEN + INTO vChecker + FROM `accounts` + WHERE accounts.Login = pLogin + LIMIT 1; + IF vChecker > 0 THEN RETURN -1; END IF; - # set new login UPDATE `accounts` - SET accounts.Login = Login - WHERE accounts.ID = UserID - LIMIT 1; + SET accounts.Login = pLogin + WHERE accounts.ID = pUserID + LIMIT 1; RETURN 0; END // DROP FUNCTION IF EXISTS ChangeMail// -CREATE FUNCTION `ChangeMail` ( `UserID` INT, - `EMail` VARCHAR(50) CHARSET utf8 - ) RETURNS int(11) +CREATE FUNCTION `ChangeMail` + ( `pUserID` INT, `pEMail` VARCHAR(50) CHARSET utf8 + ) RETURNS int(11) NO SQL BEGIN - DECLARE checker INT; + DECLARE vChecker INT DEFAULT -1; # check for account with UserID - SET checker = -1; SELECT accounts.ID - INTO checker - FROM `accounts` - WHERE accounts.ID = UserID - LIMIT 1; - IF checker <= 0 THEN + INTO vChecker + FROM `accounts` + WHERE accounts.ID = pUserID + LIMIT 1; + IF vChecker <= 0 THEN RETURN -1; END IF; # search accounts with EMail (e-mail must be unique) - SET checker = -1; + SET vChecker = -1; SELECT accounts.ID - INTO checker - FROM `accounts` - WHERE accounts.EMail = EMail - LIMIT 1; + INTO vChecker + FROM `accounts` + WHERE accounts.EMail = pEMail + LIMIT 1; IF checker > 0 THEN RETURN -1; END IF; # set new e-mail UPDATE `accounts` - SET accounts.EMail = EMail - WHERE accounts.ID = UserID - LIMIT 1; + SET accounts.EMail = pEMail + WHERE accounts.ID = pUserID + LIMIT 1; RETURN 0; END // DROP FUNCTION IF EXISTS SignIn// -CREATE FUNCTION `SignIn`( `LoginOrMail` VARCHAR(255) CHARSET utf8, - `Password` VARCHAR(64) CHARSET utf8 - ) RETURNS int(11) +CREATE FUNCTION `SignIn` + ( `pLoginOrMail` VARCHAR(255) CHARSET utf8, + `pPassword` VARCHAR(64) CHARSET utf8 + ) RETURNS int(11) NO SQL BEGIN - DECLARE curID INT; + DECLARE vAccountID INT DEFAULT -1; - SET curID = -1; + #check account existence SELECT accounts.ID - INTO curID - FROM `accounts` - WHERE accounts.Password = Password AND - ( accounts.Login = LoginOrMail OR - accounts.EMail = LoginOrMail ) - LIMIT 1; - IF curID <= 0 THEN + INTO vAccountID + FROM `accounts` + WHERE accounts.Password = pPassword AND + (accounts.Login = pLoginOrMail OR accounts.EMail = pLoginOrMail) + LIMIT 1; + IF vAccountID <= 0 THEN RETURN -1; END IF; # loging INSERT INTO `logs_signin` - ( logs_signin.AccountID ) - VALUES ( curID ); - RETURN curID; + (logs_signin.AccountID) + VALUES (vAccountID); + + RETURN vAccountID; END // @@ -1112,163 +1104,150 @@ END // DROP FUNCTION IF EXISTS ChangeTeacherInfo// -CREATE FUNCTION `ChangeTeacherInfo` ( `TeacherID` INT, - `TeacherLast` VARCHAR(30) CHARSET utf8, - `TeacherFirst` VARCHAR(30) CHARSET utf8, - `TeacherSecond` VARCHAR(30) CHARSET utf8, - `JobPositionID` INT, - `DepartmentID` INT - ) RETURNS int(11) +CREATE FUNCTION `ChangeTeacherInfo` + ( `pTeacherID` INT, + `pLastName` VARCHAR(30) CHARSET utf8, + `pFirstName` VARCHAR(30) CHARSET utf8, + `pSecondName` VARCHAR(30) CHARSET utf8, + `pJobPositionID` INT, + `pDepartmentID` INT + ) RETURNS int(11) NO SQL BEGIN - DECLARE checker INT; - SET checker = -1; + DECLARE vChecker INT DEFAULT -1; # check existing of Teacher, jobPosition & Department SELECT teachers.ID - INTO checker - FROM `teachers` - INNER JOIN `job_positions` ON JobPositionID = job_positions.ID - INNER JOIN `departments` ON DepartmentID = departments.ID - WHERE TeacherID = teachers.ID - LIMIT 1; - IF checker <= 0 OR - TeacherLast IS NULL OR - TeacherSecond IS NULL OR - TeacherSecond IS NULL + INTO vChecker + FROM `teachers` + INNER JOIN `job_positions` ON job_positions.ID = pJobPositionID + INNER JOIN `departments` ON departments.ID = pDepartmentID + WHERE pTeacherID = teachers.ID + LIMIT 1; + IF vChecker <= 0 OR + pLastName IS NULL OR + pSecondName IS NULL OR + pFirstName IS NULL THEN RETURN -1; END IF; # set new info UPDATE `teachers` - SET teachers.LastName = TeacherLast, - teachers.FirstName = TeacherFirst, - teachers.SecondName = TeacherSecond, - teachers.JobPositionID = JobPositionID, - teachers.DepartmentID = DepartmentID - WHERE TeacherID = teachers.ID - LIMIT 1; + SET teachers.LastName = pLastName, + teachers.FirstName = pFirstName, + teachers.SecondName = pSecondName, + teachers.JobPositionID = pJobPositionID, + teachers.DepartmentID = pDepartmentID + WHERE teachers.ID = pTeacherID + LIMIT 1; RETURN 0; END // DROP PROCEDURE IF EXISTS GetTeachersByFaculty// -CREATE PROCEDURE `GetTeachersByFaculty` ( IN `FacultyID` INT - ) +CREATE PROCEDURE `GetTeachersByFaculty` (IN `pFacultyID` INT) NO SQL BEGIN - SELECT teachers.ID AS 'ID', - teachers.LastName AS 'Last', - teachers.FirstName AS 'First', - teachers.SecondName AS 'Second', - teachers.AccountID AS 'AccountID', - job_positions.Name AS 'JobPositionName', - departments.ID AS 'DepID', - departments.Name AS 'DepName' - FROM `teachers` - INNER JOIN `departments` ON departments.ID = teachers.DepartmentID AND - FacultyID = departments.FacultyID - INNER JOIN `job_positions` ON job_positions.ID = teachers.JobPositionID - ORDER BY teachers.LastName ASC, - teachers.FirstName ASC, - teachers.SecondName ASC; + SELECT view_teachers.Teacher AS 'ID', + view_teachers.LastName AS 'Last', + view_teachers.FirstName AS 'First', + view_teachers.SecondName AS 'Second', + view_teachers.AccountID, + view_teachers.JobPositionName, + view_teachers.DepID, + view_teachers.DepName + FROM `view_teachers` + WHERE view_teachers.FacultyID = pFacultyID + ORDER BY view_teachers.LastName ASC, view_teachers.FirstName ASC; END // -# CHANGE DROP PROCEDURE IF EXISTS GetTeachersByDepartment// -CREATE PROCEDURE `GetTeachersByDepartment` ( IN `DepartmentID` INT - ) +CREATE PROCEDURE `GetTeachersByDepartment` (IN `pDepartmentID` INT) NO SQL BEGIN - SELECT teachers.ID AS 'ID', - teachers.LastName AS 'Last', - teachers.FirstName AS 'First', - teachers.SecondName AS 'Second', - teachers.AccountID AS 'AccountID', - job_positions.Name AS 'JobPositionName', - departments.ID AS 'DepID', - departments.Name AS 'DepName' - FROM `teachers` - INNER JOIN `departments` ON teachers.DepartmentID = departments.ID AND - DepartmentID = departments.ID - INNER JOIN `job_positions` ON job_positions.ID = teachers.JobPositionID - ORDER BY teachers.LastName ASC, - teachers.FirstName ASC, - teachers.SecondName ASC; + SELECT view_teachers.Teacher AS 'ID', + view_teachers.LastName AS 'Last', + view_teachers.FirstName AS 'First', + view_teachers.SecondName AS 'Second', + view_teachers.AccountID, + view_teachers.JobPositionName, + view_teachers.DepID, + view_teachers.DepName + FROM `view_teachers` + WHERE view_teachers.DepID = pDepartmentID + ORDER BY view_teachers.LastName ASC, view_teachers.FirstName ASC; END // DROP FUNCTION IF EXISTS CreateTeacher// -CREATE FUNCTION `CreateTeacher`( `Last` VARCHAR(30) CHARSET utf8, - `First` VARCHAR(30) CHARSET utf8, - `Second` VARCHAR(30) CHARSET utf8, - `JobPositionID` INT, - `DepartmentID` INT, - `Code` VARCHAR(40) CHARSET utf8 - ) RETURNS int(11) +CREATE FUNCTION `CreateTeacher` + ( `pLastName` VARCHAR(30) CHARSET utf8, + `pFirstName` VARCHAR(30) CHARSET utf8, + `pSecondName` VARCHAR(30) CHARSET utf8, + `pJobPositionID` INT, + `pDepartmentID` INT, + `pActivationCode` VARCHAR(40) CHARSET utf8 + ) RETURNS int(11) NO SQL BEGIN - DECLARE accID, checker, RoleID INT; + DECLARE vAccountID, vChecker, vRoleID INT DEFAULT -1; - IF Code IS NULL OR Last IS NULL OR First IS NULL THEN + # check input params + IF pActivationCode IS NULL OR pLastName IS NULL OR pFirstName IS NULL THEN RETURN -1; END IF; # check Department & jobPosition existing - SET checker = -1; SELECT departments.ID - INTO checker - FROM `departments` - INNER JOIN `job_positions` ON job_positions.ID = JobPositionID - WHERE departments.ID = DepartmentID - LIMIT 1; - IF checker <= 0 THEN + INTO vChecker + FROM `departments` + INNER JOIN `job_positions` ON job_positions.ID = pJobPositionID + WHERE departments.ID = pDepartmentID + LIMIT 1; + IF vChecker <= 0 THEN RETURN -1; END IF; # search accounts with same Code - SET accID = -1; SELECT accounts.ID - INTO accID - FROM `accounts` - WHERE accounts.ActivationCode = Code - LIMIT 1; - IF accID > 0 THEN + INTO vAccountID + FROM `accounts` + WHERE accounts.ActivationCode = pActivationCode + LIMIT 1; + IF vAccountID > 0 THEN RETURN -2; END IF; # user role 2 - common teacher # add new account INSERT INTO `accounts` - ( accounts.Login , accounts.Password , accounts.EMail, accounts.UserRoleID, accounts.ActivationCode ) - VALUES ( NULL, NULL, NULL, 2, Code); + ( accounts.Login , accounts.Password , accounts.EMail, + accounts.UserRoleID, accounts.ActivationCode ) + VALUES ( NULL, NULL, NULL, 2, pActivationCode); # get this account ID - SET accID = -1; + SET vAccountID = -1; SELECT accounts.ID - INTO accID - FROM `accounts` - WHERE accounts.ActivationCode = Code - LIMIT 1; - IF accID <= 0 THEN + INTO vAccountID + FROM `accounts` + WHERE accounts.ActivationCode = pActivationCode + LIMIT 1; + IF vAccountID <= 0 THEN RETURN -3; END IF; # add new teacher INSERT INTO `teachers` ( teachers.AccountID, - teachers.LastName, - teachers.FirstName, - teachers.SecondName, - teachers.JobPositionID, - teachers.DepartmentID + teachers.LastName, teachers.FirstName, teachers.SecondName, + teachers.JobPositionID, teachers.DepartmentID ) - VALUES (accID, Last, First, Second, JobPositionID, DepartmentID); + VALUES (vAccountID, pLastName, pFirstName, pSecondName, pJobPositionID, pDepartmentID); RETURN 0; END // @@ -1276,63 +1255,67 @@ END // # TODO: deprecated DROP FUNCTION IF EXISTS CreateTeacherByDepName// -CREATE FUNCTION `CreateTeacherByDepName`( `Last` VARCHAR(30) CHARSET utf8, - `First` VARCHAR(30) CHARSET utf8, - `Second` VARCHAR(30) CHARSET utf8, - `DepartmentName` VARCHAR(200) CHARSET utf8, - `Code` VARCHAR(40) CHARSET utf8 - ) RETURNS int(11) +CREATE FUNCTION `CreateTeacherByDepName` + ( `pLastName` VARCHAR(30) CHARSET utf8, + `pFirstName` VARCHAR(30) CHARSET utf8, + `pSecondName` VARCHAR(30) CHARSET utf8, + `pDepartmentName` VARCHAR(200) CHARSET utf8, + `pActivationCode` VARCHAR(40) CHARSET utf8 + ) RETURNS int(11) NO SQL BEGIN - DECLARE curID, checker, RoleID, DepID INT; + DECLARE vAccountID, vChecker, vRoleID, vDepID INT DEFAULT -1; - IF Code IS NULL OR Last IS NULL OR First IS NULL THEN + # check input params + IF pActivationCode IS NULL OR pLastName IS NULL OR pFirstName IS NULL THEN RETURN -1; END IF; - SET checker = -1; + # try to find a department with pDepartmentName SELECT departments.ID - INTO DepID - FROM `departments` - WHERE departments.Name = DepartmentName OR - (DepartmentName = '' AND departments.Name IS NULL) - LIMIT 1; + INTO vDepID + FROM `departments` + WHERE departments.Name = pDepartmentName OR + (pDepartmentName = '' AND departments.Name IS NULL) + # or stub department record + LIMIT 1; IF DepID <= 0 THEN RETURN -1; END IF; - SET checker = -1; + # TODO: hard code '12' + # try to find default job_position SELECT job_positions.ID - INTO checker - FROM `job_positions` - WHERE job_positions.ID = 12 - LIMIT 1; - IF checker <= 0 THEN + INTO vChecker + FROM `job_positions` + WHERE job_positions.ID = 12 + LIMIT 1; + IF vChecker <= 0 THEN RETURN -1; END IF; - SET curID = -1; SELECT accounts.ID - INTO curID - FROM `accounts` - WHERE accounts.ActivationCode = Code - LIMIT 1; - IF curID > 0 THEN + INTO vAccountID + FROM `accounts` + WHERE accounts.ActivationCode = pActivationCode + LIMIT 1; + IF vAccountID > 0 THEN RETURN -2; END IF; # TODO: user roles INSERT INTO `accounts` - ( accounts.Login , accounts.Password , accounts.EMail, accounts.UserRoleID, accounts.ActivationCode ) - VALUES ( NULL, NULL, NULL, 2, Code); + ( accounts.Login , accounts.Password , accounts.EMail, + accounts.UserRoleID, accounts.ActivationCode ) + VALUES ( NULL, NULL, NULL, 2, pActivationCode); - SET curID = -1; + SET vAccountID = -1; SELECT accounts.ID - INTO curID - FROM `accounts` - WHERE accounts.ActivationCode = Code - LIMIT 1; - IF curID <= 0 THEN + INTO vAccountID + FROM `accounts` + WHERE accounts.ActivationCode = pActivationCode + LIMIT 1; + IF vAccountID <= 0 THEN RETURN -3; END IF; @@ -1344,70 +1327,75 @@ BEGIN teachers.JobPositionID, teachers.DepartmentID ) - VALUES (curID, Last, First, Second, 12, DepID); + VALUES (vAccountID, pLastName, pFirstName, pSecondName, 12, vDepID); RETURN 0; END // DROP PROCEDURE IF EXISTS GetTeachersForDiscipline// -CREATE PROCEDURE `GetTeachersForDiscipline`(IN `DisciplineID` INT) +CREATE PROCEDURE `GetTeachersForDiscipline`(IN `pDisciplineID` INT) NO SQL BEGIN - SELECT teachers.ID AS 'ID', - teachers.LastName AS 'Last', - teachers.FirstName AS 'First', - teachers.SecondName AS 'Second', - job_positions.ID AS 'JobPositionID', - job_positions.Name AS 'JobPositionName', - departments.ID AS 'DepID', - departments.Name AS 'DepName', - faculties.ID AS 'FacultyID', - faculties.Name AS 'FacultyName', - faculties.Abbr AS 'FacultyAbbr', - (teachers.ID = disciplines.AuthorID) AS 'isAuthor' - FROM `disciplines_teachers` - INNER JOIN `disciplines` ON disciplines.ID = disciplines_teachers.DisciplineID - INNER JOIN `teachers` ON teachers.ID = disciplines_teachers.TeacherID - INNER JOIN `departments` ON departments.ID = teachers.DepartmentID - INNER JOIN `faculties` ON departments.FacultyID = faculties.ID - INNER JOIN `job_positions` ON job_positions.ID = teachers.JobPositionID - WHERE disciplines_teachers.DisciplineID = DisciplineID - ORDER BY isAuthor DESC, teachers.LastName ASC; + SELECT view_disciplines_teachers.TeacherID AS 'ID', + view_disciplines_teachers.LastName AS 'Last', + view_disciplines_teachers.FirstName AS 'First', + view_disciplines_teachers.SecondName AS 'Second', + view_disciplines_teachers.JobPositionID, + view_disciplines_teachers.JobPositionName, + view_disciplines_teachers.DepID, + view_disciplines_teachers.DepName, + view_disciplines_teachers.FacultyID, + view_disciplines_teachers.FacultyAbbr, + view_disciplines_teachers.IsAuthor AS 'isAuthor' + FROM `view_disciplines_teachers` + WHERE view_disciplines_teachers.DisciplineID = pDisciplineID + ORDER BY view_disciplines_teachers.IsAuthor DESC, + view_disciplines_teachers.LastName ASC, + view_disciplines_teachers.FirstName ASC; END // -# TODO: rename +# TODO: fail DROP PROCEDURE IF EXISTS SearchTeachers// -CREATE PROCEDURE `SearchTeachers` ( IN `FacultyID` INT, - IN `DepartmentID` INT, - IN `Name` VARCHAR(100) CHARSET utf8, - IN `DisciplineID` INT - ) +CREATE PROCEDURE `SearchTeachers` + ( IN `pFacultyID` INT, IN `pDepartmentID` INT, + IN `pFullName` VARCHAR(100) CHARSET utf8, + IN `pDisciplineID` INT ) NO SQL BEGIN - SELECT teachers.ID AS 'ID', - teachers.LastName AS 'Last', - teachers.FirstName AS 'First', - teachers.SecondName AS 'Second', - teachers.AccountID AS 'AccountID', - job_positions.Name AS 'JobPositionName', - departments.ID AS 'DepID', - departments.Name AS 'DepName' - FROM `teachers` - INNER JOIN `departments` ON teachers.DepartmentID = departments.ID AND - ( DepartmentID = 0 OR DepartmentID = departments.ID ) AND - ( FacultyID = 0 OR FacultyID = departments.FacultyID ) - INNER JOIN `job_positions` ON teachers.JobPositionID = job_positions.ID - WHERE NOT InternalIsTeacherBindeded(teachers.ID, DisciplineID) AND - CONCAT(teachers.LastName, teachers.FirstName, teachers.SecondName) LIKE CONCAT("%",Name,"%") - ORDER BY departments.FacultyID ASC, - departments.Name ASC, - teachers.LastName ASC, - teachers.FirstName ASC, - teachers.SecondName ASC; + DECLARE vAuthorID INt DEFAULT -1; + SELECT disciplines.AuthorID + INTO vAuthorID + FROM `disciplines` + WHERE disciplines.ID = pDisciplineID + LIMIT 1; + + + SELECT DISTINCT + view_teachers.TeacherID AS 'ID', + view_teachers.LastName AS 'Last', + view_teachers.FirstName AS 'First', + view_teachers.SecondName AS 'Second', + view_teachers.JobPositionName, + view_teachers.DepID, + view_teachers.DepName, + (view_teachers.TeacherID = vAuthorID) AS 'isAuthor' + FROM `view_teachers` + LEFT JOIN `disciplines_teachers` ON disciplines_teachers.TeacherID = view_teachers.TeacherID AND + disciplines_teachers.DisciplineID = pDisciplineID + WHERE disciplines_teachers.ID IS NULL AND + (pDepartmentID = 0 OR pDepartmentID = view_teachers.DepID ) AND + pFacultyID = view_teachers.FacultyID AND + CONCAT( view_teachers.LastName, + view_teachers.FirstName, + view_teachers.SecondName) + LIKE CONCAT("%",pFullName,"%") + ORDER BY view_teachers.FacultyID ASC, + view_teachers.DepName ASC, + view_teachers.LastName ASC, view_teachers.FirstName ASC; END // @@ -1417,426 +1405,346 @@ END // DROP PROCEDURE IF EXISTS GetStudentsByStudyGroups// DROP PROCEDURE IF EXISTS GetStudents// -CREATE PROCEDURE `GetStudents` ( IN `StudyGroupID` INT - ) +CREATE PROCEDURE `GetStudents` (IN `pGroupID` INT) NO SQL BEGIN - SELECT students.ID AS 'ID', - students.LastName AS 'Last', - students.FirstName AS 'First', - students.SecondName AS 'Second', - students.AccountID AS 'AccountID', - grades.ID AS 'GradeID', - grades.Num AS 'GradeNum', - grades.Degree AS 'Degree', - study_groups.ID AS 'GroupID', - study_groups.GroupNum AS 'GroupNum' - FROM `students` - INNER JOIN `study_groups` ON students.StudyGroupID = study_groups.ID AND - StudyGroupID = study_groups.ID - INNER JOIN `grades` ON study_groups.GradeID = grades.ID - ORDER BY students.LastName ASC, - students.FirstName ASC, - students.SecondName ASC; + SELECT view_students.StudentID AS 'ID', + view_students.LastName AS 'Last', + view_students.FirstName AS 'FirstName', + view_students.SecondName AS 'SecondName', + view_students.AccountID, + view_students.GradeID, + view_students.GradeNum, + view_students.Degree, + view_students.GroupID, + view_students.GroupNum + FROM `view_students` + WHERE view_students.GroupID = pGroupID + ORDER BY view_students.LastName ASC, view_students.FirstName ASC; END // DROP PROCEDURE IF EXISTS GetStudentsByFaculty// -CREATE PROCEDURE `GetStudentsByFaculty` ( IN `FacultyID` INT +CREATE PROCEDURE `GetStudentsByFaculty` ( IN `pFacultyID` INT ) NO SQL BEGIN - SELECT students.ID AS 'ID', - students.LastName AS 'Last', - students.FirstName AS 'First', - students.SecondName AS 'Second', - students.AccountID AS 'AccountID', - grades.ID AS 'GradeID', - grades.Num AS 'GradeNum', - study_groups.ID AS 'GroupID', - study_groups.GroupNum AS 'GroupNum', - grades.Degree AS 'Degree' - FROM `students` - INNER JOIN `study_groups` ON study_groups.ID = students.StudyGroupID - INNER JOIN `grades` ON study_groups.GradeID = grades.ID - INNER JOIN `specializations` ON study_groups.SpecializationID = specializations.ID AND - FacultyID = specializations.FacultyID - ORDER BY students.LastName ASC, - students.FirstName ASC, - students.SecondName ASC; -END // - + SELECT view_students.StudentID AS 'ID', + view_students.LastName AS 'Last', + view_students.FirstName AS 'FirstName', + view_students.SecondName AS 'SecondName', + view_students.AccountID, + view_students.GradeID, + view_students.GradeNum, + view_students.Degree, + view_students.GroupID, + view_students.GroupNum + FROM `view_students` + WHERE view_students.FacultyID = pFacultyID + ORDER BY view_students.LastName ASC, view_students.FirstName ASC; +END // + + + +-- TODO: deprecated +-- DROP PROCEDURE IF EXISTS GetStudentsByGradeID// +-- CREATE PROCEDURE `GetStudentsByGradeID` ( IN `GradeID` INT, +-- IN `FacultyID` INT ) +-- NO SQL +-- BEGIN +-- SELECT DISTINCT students.ID AS 'StudentID', +-- students.LastName As 'StudentLast', +-- students.FirstName AS 'StudentFirst', +-- students.SecondName AS 'StudentSecond', +-- students.AccountID AS 'StudentAccID', +-- study_groups.ID AS 'GroupID', +-- grades.ID AS 'GradeID', +-- grades.Num AS 'GroupGrade', +-- grades.Degree AS 'GroupDegree', +-- study_groups.GroupNum AS 'GroupNum', +-- disciplines_students.Type AS 'Type' +-- # where it's? +-- FROM `students` +-- INNER JOIN `study_groups` ON students.StudyGroupID = study_groups.ID AND +-- GradeID = study_groups.GradeID +-- INNER JOIN `specializations` ON study_groups.SpecializationID = specializations.ID AND +-- FacultyID = specializations.FacultyID +-- INNER JOIN `grades` ON study_groups.GradeID = grades.ID +-- ORDER BY students.LastName ASC, +-- students.FirstName ASC, +-- students.SecondName ASC; +-- END // -DROP PROCEDURE IF EXISTS GetStudentsByGradeID// -CREATE PROCEDURE `GetStudentsByGradeID` ( IN `GradeID` INT, - IN `FacultyID` INT ) - NO SQL -BEGIN - SELECT DISTINCT students.ID AS 'StudentID', - students.LastName As 'StudentLast', - students.FirstName AS 'StudentFirst', - students.SecondName AS 'StudentSecond', - students.AccountID AS 'StudentAccID', - study_groups.ID AS 'GroupID', - grades.ID AS 'GradeID', - grades.Num AS 'GroupGrade', - grades.Degree AS 'GroupDegree', - study_groups.GroupNum AS 'GroupNum', - disciplines_students.Type AS 'Type' - FROM `students` - INNER JOIN `study_groups` ON students.StudyGroupID = study_groups.ID AND - GradeID = study_groups.GradeID - INNER JOIN `specializations` ON study_groups.SpecializationID = specializations.ID AND - FacultyID = specializations.FacultyID - INNER JOIN `grades` ON study_groups.GradeID = grades.ID - ORDER BY students.LastName ASC, - students.FirstName ASC, - students.SecondName ASC; -END // - - DROP FUNCTION IF EXISTS CreateStudent// -CREATE FUNCTION `CreateStudent`( `Last` VARCHAR(30) CHARSET utf8, - `First` VARCHAR(30) CHARSET utf8, - `Second` VARCHAR(30) CHARSET utf8, - `GradeID` INT, - `GroupN` INT, - `FacultyID` INT, - `Code` VARCHAR(40) CHARSET utf8 - ) RETURNS int(11) +CREATE FUNCTION `CreateStudent` + ( `pLastName` VARCHAR(30) CHARSET utf8, + `pFirstName` VARCHAR(30) CHARSET utf8, + `pSecondName` VARCHAR(30) CHARSET utf8, + `pGradeID` INT, `pGroupNum` INT, `pFacultyID` INT, + # TODO: delete pGradeID + `pActivationCode` VARCHAR(40) CHARSET utf8 + ) RETURNS int(11) NO SQL BEGIN - DECLARE accID, StudyGroupID INT; + DECLARE vAccountID, vGroupID INT DEFAULT -1; - IF Code IS NULL OR Last IS NULL OR First IS NULL THEN + # check input params + IF pActivationCode IS NULL OR pLastName IS NULL OR pFirstName IS NULL THEN RETURN -1; END IF; - # find studygroup - SET StudyGroupID = -1; - SELECT study_groups.ID - INTO StudyGroupID - FROM `study_groups` - INNER JOIN `specializations` ON study_groups.SpecializationID = specializations.ID AND - FacultyID = specializations.FacultyID - WHERE study_groups.GradeID = GradeID AND - study_groups.ID = GroupN - LIMIT 1; - IF StudyGroupID <= 0 THEN + # find group + SELECT view_study_groups.GroupID + INTO vGroupID + FROM `view_study_groups` + WHERE view_study_groups.FacultyID = pFacultyID AND + view_study_groups.GradeID = pGradeID AND + view_study_groups.GroupNum = pGroupNum + LIMIT 1; + IF vGroupID <= 0 THEN RETURN -1; END IF; - # try to find account with same activation code - SET accID = -1; SELECT accounts.ID - INTO accID - FROM `accounts` - WHERE accounts.ActivationCode = Code - LIMIT 1; - IF accID > 0 THEN + INTO vAccountID + FROM `accounts` + WHERE accounts.ActivationCode = pActivationCode + LIMIT 1; + IF vAccountID > 0 THEN RETURN -2; END IF; # create new account INSERT INTO `accounts` - ( accounts.Login , accounts.Password , accounts.EMail, accounts.UserRoleID, accounts.ActivationCode ) - VALUES ( NULL, NULL, NULL, 1, Code); + ( accounts.Login , accounts.Password , accounts.EMail, + accounts.UserRoleID, accounts.ActivationCode ) + VALUES ( NULL, NULL, NULL, 1, pActivationCode); - # get created account ID - SET accID = -1; + SET vAccountID = -1; SELECT accounts.ID - INTO accID - FROM `accounts` - WHERE accounts.ActivationCode = Code - LIMIT 1; - IF accID <= 0 THEN + INTO vAccountID + FROM `accounts` + WHERE accounts.ActivationCode = pActivationCode + LIMIT 1; + IF vAccountID <= 0 THEN RETURN -3; END IF; - # create student INSERT INTO `students` (students.StudyGroupID, students.AccountID, students.LastName, students.FirstName, students.SecondName) - VALUES (StudyGroupID, accID, Last, First, Second); + VALUES (vGroupID, vAccountID, pLastName, pFirstName, pSecondName); RETURN 0; END // # TODO: ?#$@! magic DROP FUNCTION IF EXISTS CreateStudentEx// -CREATE FUNCTION `CreateStudentEx`( `Last` VARCHAR(30) CHARSET utf8, - `First` VARCHAR(30) CHARSET utf8, - `Second` VARCHAR(30) CHARSET utf8, - `GradeNum` INT, - `groupNum` INT, - `Degree` VARCHAR(20) CHARSET utf8, - `SpecName` VARCHAR(50) CHARSET utf8, - `FacultyID` INT, - `Code` VARCHAR(40) CHARSET utf8 - ) RETURNS int(11) +CREATE FUNCTION `CreateStudentEx` + ( `pLastName` VARCHAR(30) CHARSET utf8, + `pFirstName` VARCHAR(30) CHARSET utf8, + `pSecondName` VARCHAR(30) CHARSET utf8, + `pGradeNum` INT, `pGroupNum` INT, + `pDegree` VARCHAR(20) CHARSET utf8, + `pSpecName` VARCHAR(50) CHARSET utf8, + `pFacultyID` INT, + `pAtivationCode` VARCHAR(40) CHARSET utf8 + ) RETURNS int(11) NO SQL BEGIN - DECLARE curID, gradeID, specID, SG_ID INT; + DECLARE vAccountID, vGradeID, vSpecID, vGroupID INT DEFAULT -1; - IF Code IS NULL OR Last IS NULL OR First IS NULL THEN + IF pActivationCode IS NULL OR pLastName IS NULL OR pFirstName IS NULL THEN RETURN -1; END IF; - SET gradeID = -1; + # try to find grade SELECT grades.ID - INTO gradeID - FROM `grades` - WHERE grades.Num = GradeNum AND - grades.Degree = Degree - LIMIT 1; - IF gradeID <= 0 THEN - INSERT INTO `grades` - (grades.Num, grades.Degree) - VALUES (GradeNum, Degree); - - SET gradeID = -1; - SELECT grades.ID - INTO gradeID + INTO vGradeID FROM `grades` - WHERE grades.Num = GradeNum AND - grades.Degree = Degree + WHERE grades.Num = pGradeNum AND + grades.Degree = pDegree LIMIT 1; + + # such grade doesn't exist + IF vGradeID <= 0 THEN + # insert new grade with pGradeNum and pDegree + INSERT INTO `grades` + (grades.Num, grades.Degree) + VALUES (pGradeNum, pDegree); + + # find inserted grade + SET vGradeID = LAST_INSERT_ID(); END IF; + # try to find group + SELECT view_study_groups.GroupID + INTO vGroupID + FROM `view_study_groups` + WHERE view_study_groups.FacultyID = pFacultyID AND + view_study_groups.GroupNum = pGroupNum AND + view_study_groups.GradeID = vGradeID + LIMIT 1; - SET SG_ID = -1; - SELECT study_groups.ID - INTO SG_ID - FROM `study_groups` - INNER JOIN `specializations` ON study_groups.SpecializationID = specializations.ID - WHERE study_groups.GroupNum = groupNum AND - study_groups.GradeID = gradeID AND - specializations.FacultyID = FacultyID - LIMIT 1; - IF SG_ID <= 0 THEN - SET specID = -1; - SELECT specializations.ID - INTO specID - FROM `specializations` - WHERE ( specializations.Name = SpecName OR - ( SpecName = '' AND specializations.Name IS NULL ) - ) AND - specializations.FacultyID = FacultyID - LIMIT 1; - IF specID <= 0 THEN - INSERT INTO `specializations` - (specializations.Name, specializations.Abbr, specializations.FacultyID ) - VALUES (SpecName, NULL, FacultyID); + # group not found + IF vGroupID <= 0 THEN - SET specID = -1; - SELECT specializations.ID - INTO specID + # try to find specialization + SELECT specializations.ID + INTO vSpecID FROM `specializations` - WHERE specializations.Name = SpecName AND - specializations.FacultyID = FacultyID + WHERE (specializations.Name = pSpecName OR + (pSpecName = '' AND specializations.Name IS NULL)) AND + specializations.FacultyID = pFacultyID LIMIT 1; + + # specialization not found + IF vSpecID <= 0 THEN + # create new specialization + INSERT INTO `specializations` + (specializations.Name, specializations.Abbr, specializations.FacultyID ) + VALUES (pSpecName, NULL, pFacultyID); + + SET vSpecID = LAST_INSERT_ID(); END IF; + # create new group INSERT INTO `study_groups` - (study_groups.GradeID, study_groups.GroupNum, study_groups.SpecializationID) - VALUES (gradeID, groupNum, specID); + (study_groups.GradeID, study_groups.GroupNum, study_groups.SpecializationID) + VALUES (vGradeID, pGroupNum, vSpecID); - SET SG_ID = -1; - SELECT study_groups.ID - INTO SG_ID - FROM `study_groups` - INNER JOIN `specializations` ON study_groups.SpecializationID = specializations.ID - WHERE study_groups.GroupNum = groupNum AND - study_groups.GradeID = gradeID AND - specializations.FacultyID = FacultyID - LIMIT 1; - IF SG_ID <= 0 THEN - RETURN -1; - END IF; + SET vGroupID = LAST_INSERT_ID(); END IF; - SET curID = -1; + # check accounts with such activation code SELECT accounts.ID - INTO curID - FROM `accounts` - WHERE accounts.ActivationCode = Code - LIMIT 1; - IF curID > 0 THEN + INTO vAccountID + FROM `accounts` + WHERE accounts.ActivationCode = pActivationCode + LIMIT 1; + IF vAccountID > 0 THEN RETURN -2; END IF; # TODO: user roles + # create account INSERT INTO `accounts` - ( accounts.Login , accounts.Password , accounts.EMail, accounts.UserRoleID, accounts.ActivationCode ) - VALUES ( NULL, NULL, NULL, 1, Code); - - SET curID = -1; - SELECT accounts.ID - INTO curID - FROM `accounts` - WHERE accounts.ActivationCode = Code - LIMIT 1; - IF curID <= 0 THEN + ( accounts.Login , accounts.Password , accounts.EMail, + accounts.UserRoleID, accounts.ActivationCode ) + VALUES ( NULL, NULL, NULL, 1, pActivationCode); + + SET vAccountID = LAST_INSERT_ID(); + IF vAccountID <= 0 THEN RETURN -3; END IF; + # create student INSERT INTO `students` - (students.StudyGroupID, students.AccountID, students.LastName, students.FirstName, students.SecondName) - VALUES (SG_ID, curID, Last, First, Second); + (students.StudyGroupID, students.AccountID, + students.LastName, students.FirstName, students.SecondName) + VALUES (vGroupID, vAccountID, pLastName, pFirstName, pSecondName); RETURN 0; END // -# DROP PROCEDURE IF EXISTS SearchStudents// -# CREATE PROCEDURE `SearchStudents` ( IN `GradeID` INT, -# IN `GroupN` INT, -# IN `FacultyID` INT, -# IN `Name` VARCHAR(100) CHARSET utf8 -# ) -# NO SQL -# BEGIN -# SELECT students.ID AS 'ID', -# students.LastName AS 'Last', -# students.FirstName AS 'First', -# students.SecondName AS 'Second', -# grades.ID AS 'GradeID', -# grades.Num AS 'GradeNum', -# grades.Degree AS 'Degree', -# study_groups.ID AS 'GroupID', -# study_groups.GroupNum AS 'GroupNum' -# FROM `students` -# INNER JOIN `study_groups` ON students.StudyGroupID = study_groups.ID AND -# GradeID = study_groups.GradeID AND -# ( GroupN = 0 OR GroupN = study_groups.GroupNum ) -# INNER JOIN `specializations` ON study_groups.SpecializationID = specializations.ID -# INNER JOIN `grades` ON study_groups.GradeID = grades.ID -# WHERE FacultyID = specializations.FacultyID AND -# CONCAT(students.LastName, students.FirstName, students.SecondName) LIKE CONCAT("%",Name,"%") -# ORDER BY grades.ID ASC, study_groups.GroupNum ASC; -# END // - +# found students, that doesn't in discipline general group and not attached DROP PROCEDURE IF EXISTS SearchStudents// -CREATE PROCEDURE `SearchStudents` ( IN `GradeID` INT, - IN `StudyGroupID` INT, - IN `FacultyID` INT, - IN `Name` VARCHAR(100) CHARSET utf8, - IN `DisciplineID` INT - ) +CREATE PROCEDURE `SearchStudents` + ( IN `pGradeID` INT, IN `pGroupID` INT, IN `pFacultyID` INT, + IN `pFullName` VARCHAR(100) CHARSET utf8, + IN `pDisciplineID` INT) NO SQL -BEGIN - SELECT students.ID AS 'ID', - students.LastName AS 'Last', - students.FirstName AS 'First', - students.SecondName AS 'Second', - grades.ID AS 'GradeID', - grades.Num AS 'GradeNum', - grades.Degree AS 'Degree', - study_groups.ID AS 'GroupID', - study_groups.GroupNum AS 'GroupNum' - FROM `students` - INNER JOIN `study_groups` ON students.StudyGroupID = study_groups.ID AND - GradeID = study_groups.GradeID AND - ( StudyGroupID = 0 OR StudyGroupID = study_groups.ID ) - INNER JOIN `specializations` ON study_groups.SpecializationID = specializations.ID AND - FacultyID = specializations.FacultyID - INNER JOIN `grades` ON study_groups.GradeID = grades.ID - LEFT JOIN `disciplines_groups` ON study_groups.ID = disciplines_groups.StudyGroupID AND - DisciplineID = disciplines_groups.DisciplineID - WHERE CONCAT(students.LastName, students.FirstName, students.SecondName) LIKE CONCAT("%",Name,"%") AND - NOT InternalIsStudentAttached(students.ID, DisciplineID) AND - disciplines_groups.ID IS NULL - ORDER BY grades.ID ASC, - study_groups.GroupNum ASC; -END // - - - +BEGIN + SELECT view_students.StudentID AS 'ID', + view_students.LastName AS 'Last', + view_students.FirstName AS 'First', + view_students.SecondName AS 'Second', + view_students.GradeID, + view_students.GradeNum, + view_students.Degree, + view_students.GroupID, + view_students.GroupNum + FROM `view_students` + LEFT JOIN `disciplines_students` ON disciplines_students.StudentID = view_students.StudentID AND + disciplines_students.DisciplineID = pDisciplineID + LEFT JOIN `disciplines_groups` ON disciplines_groups.StudyGroupID = view_students.GroupID AND + disciplines_groups.DisciplineID = pDisciplineID + WHERE view_students.FacultyID = pFacultyID AND + view_students.GradeID = pGradeID AND + (view_students.GroupID = pGroupID OR pGroupID = 0) AND + CONCAT(view_students.LastName, view_students.FirstName, view_students.SecondName) + LIKE CONCAT("%", pFullName,"%") AND + disciplines_groups.ID IS NULL AND + (disciplines_students.Type IS NULL OR disciplines_students.Type != 'attach') + ORDER BY view_students.GradeID ASC, + view_students.GroupID ASC; +END // + + +# TODO: --TeacherID param +# search students, that in main group or attached DROP PROCEDURE IF EXISTS GetStudentsForDiscipline// -CREATE PROCEDURE `GetStudentsForDiscipline` ( IN `TeacherID` INT, - IN `DisciplineID` INT - ) +CREATE PROCEDURE `GetStudentsForDiscipline` + ( IN `TeacherID` INT, IN `pDisciplineID` INT) NO SQL -BEGIN - IF NOT InternalIsTeacherBindeded(TeacherID, DisciplineID) - THEN - SELECT NULL AS 'ID' - LIMIT 0; - - ELSE - SELECT DISTINCT students.ID AS 'ID', - students.LastName AS 'Last', - students.FirstName AS 'First', - students.SecondName AS 'Second', - grades.ID AS 'GradeID', - grades.Num AS 'GradeNum', - grades.Degree AS 'Degree', - study_groups.ID AS 'GroupID', - study_groups.GroupNum AS 'GroupNum', - disciplines_students.Type AS 'Type' - FROM `students` - INNER JOIN `study_groups` ON students.StudyGroupID = study_groups.ID - INNER JOIN `grades` ON grades.ID = study_groups.GradeID - LEFT JOIN `disciplines_students` ON DisciplineID = disciplines_students.DisciplineID AND - students.ID = disciplines_students.StudentID - LEFT JOIN `disciplines_groups` ON DisciplineID = disciplines_groups.DisciplineID AND - study_groups.ID = disciplines_groups.StudyGroupID - INNER JOIN `disciplines` ON DisciplineID = disciplines.ID - WHERE disciplines_groups.ID IS NOT NULL OR - disciplines_students.ID IS NOT NULL - ORDER BY grades.ID = disciplines.GradeID DESC, - grades.ID ASC, - study_groups.GroupNum ASC, - students.LastName ASC, - students.FirstName ASC, - students.SecondName ASC; - END IF; +BEGIN + SELECT view_disciplines_students.StudentID AS 'ID', + view_disciplines_students.LastName AS 'Last', + view_disciplines_students.FirstName AS 'First', + view_disciplines_students.SecondName AS 'Second', + view_disciplines_students.GradeID, + view_disciplines_students.GradeNum, + view_disciplines_students.Degree, + view_disciplines_students.GroupID, + view_disciplines_students.GroupNum, + view_disciplines_students.AttachType AS 'Type' + FROM `view_disciplines_students` + WHERE view_disciplines_students.DisciplineID = pDisciplineID + ORDER BY (view_disciplines_students.AttachType IS NULL OR + view_disciplines_students.AttachType = 'detach') DESC, + view_disciplines_students.GradeID ASC, + view_disciplines_students.GroupNum ASC, + view_disciplines_students.LastName ASC, + view_disciplines_students.FirstName ASC; END // - +# TODO: --TeacherID param +# search students, that in main group or attached DROP PROCEDURE IF EXISTS GetStudentsForRating// -CREATE PROCEDURE `GetStudentsForRating` ( IN `TeacherID` INT, - IN `DisciplineID` INT - ) +CREATE PROCEDURE `GetStudentsForRating` + ( IN `TeacherID` INT, IN `pDisciplineID` INT) NO SQL -BEGIN - IF NOT InternalIsTeacherBindeded(TeacherID, DisciplineID) - THEN - SELECT NULL AS 'ID' - LIMIT 0; - ELSE - SELECT DISTINCT students.ID AS 'ID', - students.LastName AS 'Last', - students.FirstName AS 'First', - students.SecondName AS 'Second', - grades.ID AS 'GradeID', - grades.Num AS 'GradeNum', - grades.Degree AS 'Degree', - study_groups.ID AS 'GroupID', - study_groups.GroupNum AS 'GroupNum', - (disciplines_students.Type IS NOT NULL AND disciplines_students.Type = 'attach') AS 'isAttached' - FROM `students` - INNER JOIN `study_groups` ON students.StudyGroupID = study_groups.ID - INNER JOIN `grades` ON grades.ID = study_groups.GradeID - LEFT JOIN `disciplines_students` ON DisciplineID = disciplines_students.DisciplineID AND - students.ID = disciplines_students.StudentID - WHERE InternalIsStudentAttached(students.ID, DisciplineID) - ORDER BY grades.ID ASC, - study_groups.GroupNum ASC, - students.LastName ASC, - students.FirstName ASC, - students.SecondName ASC; - END IF; +BEGIN + SELECT view_disciplines_students.StudentID AS 'ID', + view_disciplines_students.LastName AS 'Last', + view_disciplines_students.FirstName AS 'First', + view_disciplines_students.SecondName AS 'Second', + view_disciplines_students.GradeID, + view_disciplines_students.GradeNum, + view_disciplines_students.Degree, + view_disciplines_students.GroupID, + view_disciplines_students.GroupNum, + (view_disciplines_students.AttachType IS NOT NULL AND + view_disciplines_students.AttachType = 'attach') AS 'isAttached' + FROM `view_disciplines_students` + WHERE view_disciplines_students.DisciplineID = pDisciplineID AND + (view_disciplines_students.AttachType IS NULL OR + view_disciplines_students.AttachType = 'attach') + ORDER BY view_disciplines_students.GradeID ASC, + view_disciplines_students.GroupNum ASC, + view_disciplines_students.LastName ASC, + view_disciplines_students.FirstName ASC; END // @@ -1851,88 +1759,88 @@ END // DROP PROCEDURE IF EXISTS GetDisciplines// -CREATE PROCEDURE `GetDisciplines` ( IN `FacultyID` INT ) +CREATE PROCEDURE `GetDisciplines` ( IN `pFacultyID` INT ) NO SQL BEGIN - SELECT disciplines.ID AS 'ID', - subjects.ID AS 'SubjectID', - subjects.Name AS 'SubjectName', - disciplines.ExamType AS 'ExamType', - departments.Name AS 'DepName', - InternalIsMapCreated(disciplines.ID) AS 'isMapCreated' - FROM `disciplines` - INNER JOIN `subjects` ON disciplines.SubjectID = subjects.ID - INNER JOIN `teachers` ON disciplines.AuthorID = teachers.ID - INNER JOIN `departments` ON teachers.DepartmentID = departments.ID - WHERE @CurrentSemesterID = disciplines.SemesterID AND - disciplines.FacultyID = FacultyID - ORDER BY departments.Name ASC; + SELECT view_disciplines.DisciplineID AS 'ID', + view_disciplines.SubjectID, + view_disciplines.SubjectName, + view_disciplines.ExamType, + (view_disciplines_results.DisciplineRateMax = 100) + FROM `view_disciplines` + INNER JOIN `view_disciplines_results` + ON view_disciplines_results.DisciplineID = view_disciplines.DisciplineID + WHERE view_disciplines.SemesterID = @CurrentSemesterID AND + view_disciplines.FacultyID = pFacultyID + ORDER BY view_disciplines.DepName ASC; END // -# TODO bad query + +# variant 2 DROP PROCEDURE IF EXISTS GetDisciplinesForTeacher// -CREATE PROCEDURE `GetDisciplinesForTeacher`(IN `TeacherID` INT) +CREATE PROCEDURE `GetDisciplinesForTeacher`(IN `pTeacherID` INT) NO SQL BEGIN - SELECT DISTINCT disciplines.ID AS 'ID', - disciplines.ExamType AS 'ExamType', - disciplines.GradeID AS 'GradeID', - grades.Num AS 'GradeNum', - grades.Degree AS 'Degree', - study_groups.ID AS 'GroupID', - study_groups.GroupNum AS 'GroupNum', - study_groups.Name AS 'GroupName', - subjects.ID AS 'SubjectID', - subjects.Name AS 'SubjectName', - (TeacherID = disciplines.AuthorID) AS 'isAuthor', - InternalIsMapCreated(disciplines.ID) AS 'isMapCreated', - disciplines.isLocked AS 'isLocked' - FROM `disciplines_groups` - RIGHT JOIN `disciplines` ON disciplines_groups.DisciplineID = disciplines.ID OR - disciplines_groups.DisciplineID IS NULL - INNER JOIN `grades` ON grades.ID = disciplines.GradeID - INNER JOIN `disciplines_teachers` ON disciplines.ID = disciplines_teachers.DisciplineID AND - TeacherID = disciplines_teachers.TeacherID - INNER JOIN `subjects` ON subjects.ID = disciplines.SubjectID - LEFT JOIN `study_groups` ON study_groups.ID = disciplines_groups.StudyGroupID - WHERE disciplines.SemesterID = @CurrentSemesterID - ORDER BY grades.ID ASC, - subjects.Name ASC, - disciplines.ID ASC, - study_groups.GroupNum ASC; + SELECT DISTINCT view_disciplines.DisciplineID AS 'ID', + view_disciplines.ExamType, + view_disciplines.GradeID, + view_disciplines.GradeNum, + view_disciplines.Degree, + view_study_groups.GroupID, + view_study_groups.GroupNum, + view_study_groups.GroupName, + view_disciplines.SubjectID, + view_disciplines.SubjectName, + (pTeacherID = view_disciplines.AuthorID) AS 'isAuthor', + (view_disciplines_results.DisciplineRateMax = 100) AS 'isMapCreated', + view_disciplines.isLocked AS 'isLocked' + FROM `disciplines_teachers` + LEFT JOIN `disciplines_groups` ON disciplines_groups.DisciplineID = disciplines_teachers.DisciplineID + LEFT JOIN `view_study_groups` ON view_study_groups.GroupID = disciplines_groups.StudyGroupID + INNER JOIN `view_disciplines` ON disciplines_teachers.DisciplineID = view_disciplines.DisciplineID + LEFT JOIN `view_disciplines_results` ON view_disciplines_results.DisciplineID = view_disciplines.DisciplineID + WHERE disciplines_teachers.TeacherID = pTeacherID AND + view_disciplines.SemesterID = @CurrentSemesterID + ORDER BY view_disciplines.GradeID ASC, + view_disciplines.SubjectName ASC, + view_disciplines.DisciplineID ASC, + view_study_groups.GroupNum ASC; END // DROP PROCEDURE IF EXISTS GetDisciplinesForStudent// -CREATE PROCEDURE `GetDisciplinesForStudent`(IN `StudentID` INT) +CREATE PROCEDURE `GetDisciplinesForStudent`(IN `pStudentID` INT) NO SQL BEGIN - SELECT disciplines.ID AS 'ID', - subjects.ID AS 'SubjectID', - subjects.Name AS 'SubjectName', - disciplines.ExamType AS 'ExamType', - teachers.LastName AS 'Last', - teachers.FirstName AS 'First', - teachers.SecondName AS 'Second', - GetRateForDisc(StudentID, disciplines.ID ) AS 'Rate', - GetMaxRateForDisc(disciplines.ID ) AS 'MaxCurrentRate', - InternalIsMapCreated(disciplines.ID) AS 'isMapCreated' - FROM `disciplines` - INNER JOIN `subjects` ON disciplines.SubjectID = subjects.ID - INNER JOIN `teachers` ON disciplines.AuthorID = teachers.ID - WHERE @CurrentSemesterID = disciplines.SemesterID AND - InternalIsStudentAttached(StudentID, disciplines.ID) - ORDER BY disciplines.ExamType ASC, Rate DESC; + SELECT view_disciplines.DisciplineID AS 'ID', + 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_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 + view_rating_result.DisciplineID = view_disciplines_results.DisciplineID + LEFT JOIN `view_disciplines_teachers` ON view_disciplines_teachers.DisciplineID = view_disciplines.DisciplineID + WHERE view_disciplines.SemesterID = @CurrentSemesterID AND + view_disciplines_students.StudentID = pStudentID + ORDER BY disciplines.ExamType ASC, view_disciplines.DisciplineID ASC; END // DROP PROCEDURE IF EXISTS GetMapForStudent// -CREATE PROCEDURE `GetMapForStudent` ( IN `StudentID` INT, - IN `DisciplineID` INT - ) +CREATE PROCEDURE `GetMapForStudent` + ( IN `pStudentID` INT, IN `pDisciplineID` INT) NO SQL BEGIN SELECT modules.ID AS 'ModuleID', @@ -1947,9 +1855,9 @@ BEGIN modules.Type AS 'ModuleType' FROM `submodules` INNER JOIN `modules` ON submodules.ModuleID = modules.ID AND - DisciplineID = modules.DisciplineID + pDisciplineID = modules.DisciplineID LEFT JOIN `rating_table` ON submodules.ID = rating_table.SubmoduleID AND - StudentID = rating_table.StudentID + pStudentID = rating_table.StudentID WHERE modules.Type != 2 OR @@ -1958,7 +1866,7 @@ BEGIN FROM `submodules` INNER JOIN `rating_table` ON rating_table.SubModuleID = submodules.ID WHERE submodules.ModuleID = modules.ID AND - rating_table.StudentID = StudentID + rating_table.StudentID = pStudentID ORDER BY submodules.OrderNum DESC LIMIT 1) ) OR @@ -2003,7 +1911,7 @@ CREATE PROCEDURE `GetMapForDiscipline` ( IN `TeacherID` INT, ) NO SQL BEGIN - IF NOT InternalIsTeacherBindeded(TeacherID, DisciplineID) + IF NOT InternalIsTeacherBinded(TeacherID, DisciplineID) THEN SELECT NULL AS 'ID' LIMIT 0; @@ -2038,7 +1946,7 @@ CREATE PROCEDURE `GetMapForDisciplineExam` ( IN `TeacherID` INT, ) NO SQL BEGIN - IF NOT InternalIsTeacherBindeded(TeacherID, DisciplineID) + IF NOT InternalIsTeacherBinded(TeacherID, DisciplineID) THEN SELECT NULL AS 'ID' LIMIT 0; @@ -2564,7 +2472,7 @@ BEGIN END IF; # 2. check if BindingTeacher has rights to access this discipline - IF InternalIsTeacherBindeded(BindingTeacherID,DisciplineID) + IF InternalIsTeacherBinded(BindingTeacherID,DisciplineID) THEN RETURN 1; END IF; @@ -2772,7 +2680,7 @@ CREATE FUNCTION `CountRatings` ( `TeacherID` INT, BEGIN DECLARE res boolean; - IF NOT InternalIsTeacherBindeded(TeacherID, DisciplineID) THEN + IF NOT InternalIsTeacherBinded(TeacherID, DisciplineID) THEN RETURN -1; END IF; @@ -4088,7 +3996,7 @@ CREATE PROCEDURE `GetFinalFormInfo` (IN `pDisciplineID` INT, IN `pGroupID` INT) NO SQL BEGIN - DECLARE curSem INT; + DECLARE vCurSemester INT; SET vCurSemester = @CurrentSemesterID; SELECT study_groups.GroupNum AS 'GroupNum', diff --git a/db/Views.sql b/db/Views.sql index e6bb6a2ff..5b7e22579 100644 --- a/db/Views.sql +++ b/db/Views.sql @@ -1,3 +1,6 @@ + + + CREATE OR REPLACE VIEW `view_study_groups` AS SELECT study_groups.ID AS 'GroupID', study_groups.GroupNum AS 'GroupNum', @@ -17,9 +20,6 @@ CREATE OR REPLACE VIEW `view_study_groups` AS INNER JOIN `faculties` ON faculties.ID = specializations.FacultyID; - - - CREATE OR REPLACE VIEW `view_teachers` AS SELECT teachers.ID AS 'TeacherID', teachers.LastName, @@ -75,6 +75,16 @@ CREATE OR REPLACE VIEW `view_disciplines` AS INNER JOIN `grades` ON grades.ID = disciplines.GradeID; +CREATE OR REPLACE VIEW `view_disciplines_results` AS + SELECT modules.DisciplineID, + SUM(submodules.MaxRate) AS 'DisciplineRateMax', + SUM(submodules.MaxRate*submodules.isUsed) AS 'DisciplineRateCur' + FROM `submodules` + INNER JOIN `modules` ON modules.ID = submodules.ModuleID + WHERE (modules.Type = 'regular') OR (modules.Type = 'exam' AND submodules.OrderNum = 1) + GROUP BY modules.DisciplineID; + + CREATE OR REPLACE VIEW `view_disciplines_teachers` AS SELECT view_disciplines.DisciplineID, view_teachers.*, @@ -85,13 +95,14 @@ CREATE OR REPLACE VIEW `view_disciplines_teachers` AS CREATE OR REPLACE VIEW `view_disciplines_students` AS - SELECT disciplines_students.DisciplineID, + SELECT disciplines_students.DisciplineID, + disciplines_students.Type AS 'AttachType', view_students.* FROM `disciplines_students` INNER JOIN `view_students` ON view_students.StudentID = disciplines_students.StudentID - WHERE disciplines_students.Type = 'attach' UNION DISTINCT SELECT disciplines_groups.DisciplineID, + NULL AS 'AttachType', view_students.* FROM `disciplines_groups` LEFT JOIN `view_students` ON view_students.GroupID = disciplines_groups.StudyGroupID @@ -145,3 +156,4 @@ CREATE OR REPLACE VIEW `view_rating_result` AS WHERE view_rating.Rate IS NOT NULL GROUP BY view_rating.StudentID, view_rating.DisciplineID; + -- GitLab