我有一个查询,用于计算表 stu_marks 中学生的排名,而学生的姓名位于表 stu_details 中。
在stu_marks表中,我有rollNo
,exam
,percentage
和rank
列,在stu_details中,我有rollNo
,name
和{{1 }}。我还有许多其他列对此查询不是必需的。
class
现在,我正在尝试一次计算每个班级的学生排名。如果超过一个学生获得相同的百分比,则将跳过排名。
我为此使用的查询是
+--------+-------------------------+
| rollNo | name |
+--------+-------------------------+
| 361601 | ABHISHEK N D |
| 361635 | SAI CHANDAN K |
| 361642 | SAIPRASANNA GURUMOORTHY |
+--------+-------------------------+
此查询工作正常,我得到了正确的输出,即,排名得到了正确的更新。执行查询后,stu_marks表如下所示。
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;
但是当我使用+--------+------------------------+------+
| rollNo | exam |percentage | rank |
+--------+------------+-----------+------|
| 361642 | HalfYearly | 97.75 | 1 |
| 361601 | HalfYearly | 97.25 | 2 |
| 361635 | HalfYearly | 97.25 | 2 |
运行相同的查询表单Java时,它不起作用。
PreparedStatement
在这种情况下,排名无法正确更新。如您所见,97.25一次获得第二名,一次获得第三名。
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();
出什么问题了?