java - MySQL 查询在命令行和 Java 中执行时给出不同的输出
问题描述
我有一个查询来计算表 stu_marks 中学生的排名,学生的名字在表stu_details中。在 stu_marks 表中我有rollNo
,和列exam
,在 stu_details 我有,和. 我有许多其他列不需要此查询。percentage
rank
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 获得 2nd rank 一次和 3rd rank 一次。
+--------+------------------------+------+
| rollNo | exam |percentage | rank |
+--------+------------+-----------+------|
| 361642 | HalfYearly | 97.75 | 1 |
| 361601 | HalfYearly | 97.25 | 2 |
| 361635 | HalfYearly | 97.25 | 3 |
问题是什么?
解决方案
推荐阅读
- swift - 使用 NSAttributedString 在 UILabel 中的 HTML 文本(带表格)
- performance - 如何在 JMeter 中显示实际循环计数
- typescript - 告诉变量是联合类型中的哪一种
- apache-spark - csv 文件的架构
- excel - 即使存在匹配项,MATCH 也会返回 #N/A
- glusterfs - 可以从目录而不是分区创建 glusterfs 卷吗?
- python - Django:IndexError:列表索引超出范围
- java - java.net.SocketException:输入流的连接重置
- django - 如果我只有一个页面和总页数的数据,Django如何实现分页
- python - 为什么索引错误:列表超出范围即将到来?