Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php和rank中的行总和_Php - Fatal编程技术网

php和rank中的行总和

php和rank中的行总和,php,Php,我正在用php创建一个学生信息系统,数据库如下所示 **studentId** **Math** **English** **Science** **className** 1 80 66 85 3p1 2 75 83 84 3p1 3 70 88 90 3p1 4

我正在用php创建一个学生信息系统,数据库如下所示

**studentId** **Math** **English** **Science** **className**
1                 80        66         85       3p1
2                 75        83         84       3p1
3                 70        88         90       3p1
4                 50        82         50       5p3
5                 88        77         77       3p1
6                 92        97         96       3p1
我只想在使用php时对类名3P1的成员进行排名。当包含以下内容时,下面的sql语句将在phpmyadmin中进行排名

SET @myclassName:=0;
SET @myRank:= 0;
SET @myNextRank:= 0;
SET @myTotals:= 0;   
但是,当我将其转换为php并在php中使用时,生成的列组是不一致的。每次我重新加载页面时,排名也会改变。我如何包括

SET @myclassName:=0;
SET @myRank:= 0;
SET @myNextRank:= 0;
SET @myTotals:= 0;
在php中的查询中

<?php 

$StudentMarkz = "SELECT X.*,
                        @myRank:=CASE WHEN @myclassName <> className
                                           THEN @myNextRank:=1
                                      WHEN @myTotals <> totals
                                           THEN @myRank:=@myNextRank
                                      ELSE @myRank
                                 END AS Rank,
                        @myclassName:=className AS myclassName,
                        @myTotals:=totals AS myTotals,
                        @myNextRank:=@myNextRank+1 AS myNextRank
                   FROM ( SELECT studentmarkstable.studentId,surname, firstName,
                                 Math,
                                 English,
                                 Science,
                                 SocialStudies,
                                 studentmarkstable.className,
                                 Math + English + Science + SocialStudies AS totals
                            FROM studentmarkstable, student 
                           WHERE student.studentId=studentmarkstable.studentId 
                             AND studentmarkstable.className='3P1' 
                           ORDER BY className ASC,
                                    6 DESC
                        ) X";
$marksQuery = mysql_query($StudentMarkz) or die (mysql_error());

?>
这是PHP方式(当然您也可以使用mysql方式)

其他办法:

您可以在表中添加一个新字段“All”,并在其中汇总所有结果。 (将结果写入表格时,还可以对“全部”字段进行汇总) 然后,您可以使用查询和“订单依据”访问数据


嗯。以下是MySQL的解决方案,因为它可能是PHP脚本编写者中最常用的数据库:

SET @myClass:=0;
SET @myRank:= 0;
SET @myTotals:= 0;
SELECT X.*,
        @myRank:=CASE WHEN @myClass <> class 
                           THEN 1
                      WHEN @myTotals <> totals 
                           THEN @myRank+1
                      ELSE @myRank
                 END AS Rank,
        @myClass:=class AS myClass,
        @myTotals:=totals AS myTotals
  FROM ( SELECT studentId,
                Math,
                English,
                Science,
                Class,
                Math + English + Science AS totals
           FROM studentGrades
          ORDER BY 5 ASC,
                   6 DESC
       ) X
队伍中没有差距

编辑

如果您希望在几个具有相同等级的学生之后(例如1,2,2,4而不是1,2,2,3)保持后续的学生等级位置,请使用以下命令:

SET @myClass:=0;
SET @myRank:= 0;
SET @myNextRank:= 0;
SET @myTotals:= 0;
SELECT X.*,
        @myRank:=CASE WHEN @myClass <> class 
                           THEN @myNextRank:=1
                      WHEN @myTotals <> totals 
                           THEN @myRank:=@myNextRank
                      ELSE @myRank
                 END AS Rank,
        @myClass:=class AS myClass,
        @myTotals:=totals AS myTotals,
        @myNextRank:=@myNextRank+1 AS myNextRank
  FROM ( SELECT studentId,
                Math,
                English,
                Science,
                Class,
                Math + English + Science AS totals
           FROM studentGrades
          ORDER BY 5 ASC,
                   6 DESC
       ) X

排名有差距

数据库有什么特别的味道吗?因为我会使用不同的查询在MySQL或Oracle@MarkBaker合计的计算似乎正在进行,但我在排名栏上得到了一个[BLOB-0B]注释。我也会很感激,如果排名可以做每类。你可以让一个学生在3P1班中排名第一,另一个不同的学生在5P1班中排名第一。如果你研究一下这个应该如何计算排名的逻辑,你会发现它应该按班级进行排名。。这就是为什么它在@myClass class时将排名重置为1。我不知道为什么这会给你[BLOB-0B]排名:我在发布之前在phpmyadmin中测试了它,使用了我根据你的描述创建的表,以及你在示例@Mark Baker中使用的数据。我犯了一个愚蠢的错误,现在脚本工作正常。如果说两个学生共享一个共同的总数,比如440440430,而不是让他们排名1,1,2,那么就添加到脚本中。我怎样才能让他们排名1,1,3。是否没有第二(2)位?Regards@MarkBaker我如何在php中将Rank、mynextrank、myclass和mytotals初始化为0,就像您在sql语句集@myclass:=0中所做的那样;设置@myRank:=0;设置@myNextRank:=0;设置@myTotals:=0;选择X.*,。。。。因为在php代码中没有这一点,生成的排名是错误的,每次加载页面时都会不断更改。Regardsi完全无法修改和使用上述代码,请协助
SET @myClass:=0;
SET @myRank:= 0;
SET @myTotals:= 0;
SELECT X.*,
        @myRank:=CASE WHEN @myClass <> class 
                           THEN 1
                      WHEN @myTotals <> totals 
                           THEN @myRank+1
                      ELSE @myRank
                 END AS Rank,
        @myClass:=class AS myClass,
        @myTotals:=totals AS myTotals
  FROM ( SELECT studentId,
                Math,
                English,
                Science,
                Class,
                Math + English + Science AS totals
           FROM studentGrades
          ORDER BY 5 ASC,
                   6 DESC
       ) X
studentId  Math  English  Science  Class  totals  Rank  myClass  myTotals
2          75    83       84       3p1    242     1     3p1      242
5          88    77       77       3p1    242     1     3p1      242
1          80    66       85       3p1    231     2     3p1      231
6          92    97       96       5p2    285     1     5p2      285
3          70    88       90       5p2    248     2     5p2      248
4          50    82       50       5p2    182     3     5p2      182
SET @myClass:=0;
SET @myRank:= 0;
SET @myNextRank:= 0;
SET @myTotals:= 0;
SELECT X.*,
        @myRank:=CASE WHEN @myClass <> class 
                           THEN @myNextRank:=1
                      WHEN @myTotals <> totals 
                           THEN @myRank:=@myNextRank
                      ELSE @myRank
                 END AS Rank,
        @myClass:=class AS myClass,
        @myTotals:=totals AS myTotals,
        @myNextRank:=@myNextRank+1 AS myNextRank
  FROM ( SELECT studentId,
                Math,
                English,
                Science,
                Class,
                Math + English + Science AS totals
           FROM studentGrades
          ORDER BY 5 ASC,
                   6 DESC
       ) X
studentId  Math  English  Science  Class  totals  Rank  myClass  myTotals  myNextRank
2          75    83       84       3p1    242     1     3p1      242       2
5          88    77       77       3p1    242     1     3p1      242       3
1          80    66       85       3p1    231     3     3p1      231       4
6          92    97       96       5p2    285     1     5p2      285       2
3          70    88       90       5p2    248     2     5p2      248       3
4          50    82       50       5p2    182     3     5p2      182       4