From f797b9f68b76dcac6d533b9e52d859db5c65d7b8 Mon Sep 17 00:00:00 2001
From: PavelBegunkov <asml.silence@gmail.com>
Date: Mon, 26 Oct 2015 20:33:12 +0300
Subject: [PATCH] Fix getRatesForGroup(ByStage) sp

---
 db/stored/procedures.sql | 66 ++++++++++++++++++++--------------------
 1 file changed, 33 insertions(+), 33 deletions(-)

diff --git a/db/stored/procedures.sql b/db/stored/procedures.sql
index a3cb35e2c..5d0ce7959 100644
--- a/db/stored/procedures.sql
+++ b/db/stored/procedures.sql
@@ -1003,18 +1003,18 @@ BEGIN
         SELECT students_groups.StudentID
         FROM `students_groups`
         LEFT JOIN `disciplines_students` ON disciplines_students.DisciplineID = pDisciplineID AND
-                                            disciplines_students.StudentID = students.ID
-        WHERE   students_groups.StudentID = students.ID AND
-                students_groups.SemesterID = vSemesterID AND
-                students_groups.State <= 'outlet' AND
-                CASE WHEN !vInGeneralGroup THEN
-                    students_groups.GroupID = pGroupID AND
-                    disciplines_students.ID IS NOT NULL
+                                            disciplines_students.StudentID = students_groups.StudentID
+        WHERE   students_groups.SemesterID = vSemesterID AND
+                students_groups.State <= 'outlet' AND # actual students
+                students_groups.GroupID = pGroupID AND
+                CASE WHEN vInGeneralGroup THEN
+                    NOT disciplines_students.Type <=> 'detach' # not detached
                 ELSE
-                    disciplines_students.ID IS NULL
+                    disciplines_students.Type <=> 'attach' # is attached
                 END
     );
 
+    DROP TABLE IF EXISTS vRoadMap
     CREATE TEMPORARY TABLE vRoadMap AS (
         SELECT  view_roadmap.SubmoduleID,
                 view_roadmap.ModuleType AS 'Type'
@@ -1037,8 +1037,8 @@ BEGIN
                    MAX(IF(vRoadMap.Type = 'exam', rt.Rate, 0)) AS 'RateExam'
                 FROM tStudents
                 CROSS JOIN vRoadMap
-                LEFT JOIN `rating_table` as rt  ON  rating_table.StudentID = tStudents.StudentID AND
-                                                    rating_table.SubmoduleID = vRoadMap.SubmoduleID
+                LEFT JOIN `rating_table` as rt  ON  rt.StudentID = tStudents.StudentID AND
+                                                    rt.SubmoduleID = vRoadMap.SubmoduleID
                 GROUP BY tStudents.StudentID
         ) vRates
         INNER JOIN `students` ON students.ID = vRates.StudentID
@@ -1126,6 +1126,7 @@ CREATE PROCEDURE `GetRatesForGroupByStage` (
 ) NO SQL
 BEGIN
     DECLARE vSemesterID, vGroupID INT DEFAULT -1;
+    DECLARE vInGeneralGroup BOOL DEFAULT FALSE;
     SET vSemesterID = GetDisciplineProperty(pDisciplineID, 'semester');
     DROP TABLE IF EXISTS tStudents;
     CREATE TEMPORARY TABLE tStudents (
@@ -1133,30 +1134,29 @@ BEGIN
     );
 
     # check that group attached to discipline. Otherwise vGroupID = -1;
-    SELECT disciplines_groups.GroupID INTO vGroupID
-        FROM `disciplines_groups`
-        WHERE   disciplines_groups.GroupID = pGroupID AND
-                disciplines_groups.DisciplineID = pDisciplineID
-        LIMIT 1;
+    SET vInGeneralGroup = EXISTS(
+        SELECT * FROM `disciplines_groups`
+        WHERE disciplines_groups.DisciplineID = pDisciplineID AND
+              disciplines_groups.GroupID = pGroupID
+        LIMIT 1
+    );
 
-    # get all students from group, that take this discipline
-    IF vGroupID <= 0 THEN # doesn't attached
-        INSERT INTO tStudents (`StudentID`)
-        SELECT disciplines_students.StudentID
-            FROM `disciplines_students`
-            WHERE   disciplines_students.DisciplineID = pDisciplineID AND
-                    disciplines_students.Type = 'attach';
-    ELSE # attached group
-        INSERT INTO tStudents (`StudentID`)
-        SELECT students_groups.StudentID
-            FROM `students_groups`
-            LEFT JOIN `disciplines_students` ON disciplines_students.StudentID = students_groups.StudentID AND
-                                                disciplines_students.DisciplineID = pDisciplineID
-            WHERE   students_groups.GroupID = vGroupID AND
-                    students_groups.SemesterID = vSemesterID AND
-                    students_groups.State <= 'outlet' AND
-                    NOT disciplines_students.Type <=> 'detach'; # exclude detached students
-    END IF;
+
+    DROP TABLE IF EXISTS tStudents;
+    CREATE TEMPORARY TABLE tStudents AS (
+      SELECT students_groups.StudentID
+      FROM `students_groups`
+        LEFT JOIN `disciplines_students` ON disciplines_students.DisciplineID = pDisciplineID AND
+                                            disciplines_students.StudentID = students_groups.StudentID
+      WHERE   students_groups.SemesterID = vSemesterID AND
+              students_groups.State <= 'outlet' AND # actual students
+              students_groups.GroupID = pGroupID AND
+              CASE WHEN vInGeneralGroup THEN
+                NOT disciplines_students.Type <=> 'detach' # not detached
+              ELSE
+                disciplines_students.Type <=> 'attach' # is attached
+              END
+    );
 
     SELECT  tRes.*,
             students.LastName,
-- 
GitLab