У меня есть запрос, который вычисляет ранги студентов в таблице stu_marks , а имена студентов находятся в таблице stu_details .В таблице stu_marks у меня есть столбцы rollNo
, exam
, percentage
и rank
, а в stu_details - rollNo
, name
и class
.У меня есть много других столбцов, которые не требуются для этого запроса.
+--------+-------------------------+
| rollNo | name |
+--------+-------------------------+
| 361601 | ABHISHEK N D |
| 361635 | SAI CHANDAN K |
| 361642 | SAIPRASANNA GURUMOORTHY |
+--------+-------------------------+
Теперь я пытаюсь подсчитать количество учеников в каждом классе за раз для сдачи экзамена.Ранги будут пропущены, если более одного студента получат одинаковый процент.
Для этого запроса я использую
set @rnk=0; set @rank=0; set @curScore = 0;
update stu_marks sm join
(SELECT A.*, (@rnk:=@rnk+1) rnk,
(@rank:=IF(@curscore=percentage,@rank,@rnk)) rank,
(@curscore:=percentage) newscore from
(select sm1.rollNo, name, percentage, exam from stu_marks
sm1 join stu_details sd1 where sd1.rollNo=sm1.rollNo and
class='X' and exam='HalfYearly' order by percentage desc) A
) AA set sm.rank = AA.rank where sm.rollNo=AA.rollNo and sm.exam=AA.exam;
Этот запрос работает нормально, и я получаю правильный вывод, т. Е.ранги обновляются должным образом.После выполнения запроса таблица stu_marks выглядит следующим образом.
+--------+------------------------+------+
| rollNo | exam |percentage | rank |
+--------+------------+-----------+------|
| 361642 | HalfYearly | 97.75 | 1 |
| 361601 | HalfYearly | 97.25 | 2 |
| 361635 | HalfYearly | 97.25 | 2 |
Но когда я запускаю ту же форму запроса Java, используя PreparedStatement
, она не работает.
ps.executeUpdate("SET @rnk=0");
ps.executeUpdate("SET @rank=0");
ps.executeUpdate("SET @curPer=0");
String calculateRank = "update stu_marks sm join"
+ "(SELECT A.*, (@rnk:=@rnk+1) rnk, (@rank:=IF(@curscore=percentage,@rank,@rnk)) rank, "
+ "(@curscore:=percentage) newscore from "
+ " (select sm1.rollNo, name, percentage, exam "
+ " from stu_marks sm1 join stu_details sd1 "
+ " where sd1.rollNo=sm1.rollNo and class=? and exam=? "
+ " order by percentage desc) A) AA "
+ "set sm.rank = AA.rank where sm.rollNo=AA.rollNo and sm.exam=AA.exam;";
ps = con.prepareStatement(calculateRank);
ps.setString(1, chosenClass);
ps.setString(2, chosenExam);
System.out.println(ps);
ps.executeUpdate();
В этом случае ранги не обновляются должным образом.Как видите, 97,25 получает 2-й ранг один раз и 3-й ранг один раз.
+--------+------------------------+------+
| rollNo | exam |percentage | rank |
+--------+------------+-----------+------|
| 361642 | HalfYearly | 97.75 | 1 |
| 361601 | HalfYearly | 97.25 | 2 |
| 361635 | HalfYearly | 97.25 | 3 |
В чем проблема?