在命令行和Java中执行时,MySQL查询给出不同的输出

时间:2018-10-26 12:26:13

标签: java mysql prepared-statement

我有一个查询,用于计算表 stu_marks 中学生的排名,而学生的姓名位于表 stu_details 中。 在stu_marks表中,我有rollNoexampercentagerank列,在stu_details中,我有rollNoname和{{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();

出什么问题了?

0 个答案:

没有答案