php和rank中的行总和
我正在用php创建一个学生信息系统,数据库如下所示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
**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