首页 > 解决方案 > MySQL 查询在命令行和 Java 中执行时给出不同的输出

问题描述

我有一个查询来计算表 stu_marks 中学生的排名,学生名字在表stu_details中。在 stu_marks 表中我有rollNo,和列exam,在 stu_details 我有,和. 我有许多其他列不需要此查询。percentagerankrollNonameclass

+--------+-------------------------+
| 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 |

问题是什么?

标签: javamysqlprepared-statement

解决方案


推荐阅读