繁体   English   中英

在PHP和排名中汇总行

[英]Sum rows in php and rank

我在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时只排名className 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());

?>

如果我使用$ marksQuery = mysqli_multi_query($ StudentMarkz)或die(mysql_error()); 我收到一个错误。

先感谢您

这是PHP方式(当然你也可以使用mysql方式)。

$sql = "SELECT studentId, Math, Engish, Science FROM table";
$query = mysql_query($sql) or die("Request not successfull!");

$results = array();

while ($result = mysql_fetch_array($adressen_query)){   
  $results[ $result['studentId'] ] = $result['Math'] + $result['Engish'] + $result['Science'];
}
// results now contains all studentIds as Keys and all added result values as value.

// sort descending
$results = arsort( $results );

其他方法:

您可以在表格中添加一个新字段“全部”,并在那里总结所有结果。 (将结果写入表格时,您也可以总结“全部”字段)然后您可以使用查询和“ORDER BY”访问您的数据

SELECT 'All' FROM table ORDER BY 'All' DESC;

好。 这是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

得到:

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

没有差距的队伍

编辑

如果您希望在具有相同等级的几个学生(例如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

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

在队伍中存在差距

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM