如何使用 PHP 和 MySQL 显示学生在百名学生中的排名?
Posted
技术标签:
【中文标题】如何使用 PHP 和 MySQL 显示学生在百名学生中的排名?【英文标题】:How to display a students rank out of hundred students using PHP & MySQL? 【发布时间】:2010-06-18 21:30:48 【问题描述】:我正在尝试从一百个班级中获取某个学生的排名,我希望能够显示学生的排名。
我正在尝试按成绩和学分获得学生的排名。例如,如果student 1
有 2 个 A+ 成绩,总分 10 分,student 2
有 3 个 B- 成绩,总分 10 分,student 1
将排名更高。我想知道如何使用 php 和 mysql 做到这一点?
这是我目前拥有的 PHP 和 MySQL 代码。
$gp = array();
$dbc = mysqli_query($mysqli,"SELECT grades.*, homework_grades.*, users_homework.*
FROM grades
LEFT JOIN homework_grades ON grades.id = homework_grades.grade_id
LEFT JOIN users_homework ON homework_grades.users_homework_id = users_homework.id
WHERE users_homework.user_id = '$user_id'
AND users_homework.grade_average = 'A+'");
if (!$dbc)
print mysqli_error($mysqli);
else
while($row = mysqli_fetch_array($dbc))
$gp[] = $row['grade_points'];
echo array_sum($gp);
这是我的 MySQL 表。
CREATE TABLE homework_grades (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
grade_id INT UNSIGNED NOT NULL,
users_homework_id INT UNSIGNED NOT NULL,
user_id INT UNSIGNED NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE grades (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
letter_grade VARCHAR NOT NULL,
grade_points FLOAT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (id)
);
CREATE TABLE users_homework (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_id INT UNSIGNED NOT NULL,
homework_content LONGTEXT NOT NULL,
grade_average VARCHAR DEFAULT NULL,
PRIMARY KEY (id)
);
【问题讨论】:
您可以做的是查看有多少成绩 - 成绩的数量 - 每个学生的成绩并按此 Asc 排序,然后按实际分数排序。例如:学生 1 有 2 个 A+,学生 2 有 3B-,因此他们都有 10 分。但是,学生一只有 2 个成绩给了他 10 分,所以这意味着学生一应该有更高的排名。 【参考方案1】:已更新
你需要一个聚合。执行 SUM() 和 COUNT()。 COUNT 会告诉你作业的数量,sum 会告诉你总成绩。 GROUP BY user_id 为每个学生获取此信息。
$gp = array();
$dbc = mysqli_query($mysqli,"SELECT SUM(grade_points) as grade_points, user_id, count(*) as num_assignments
FROM grades
LEFT JOIN homework_grades ON grades.id = homework_grades.grade_id
LEFT JOIN users_homework ON homework_grades.users_homework_id = users_homework.id
GROUP BY user_id
ORDER BY grade_points DESC , num_assignments ASC'");
if (!$dbc)
print mysqli_error($mysqli);
else
$i=1;
while($row = mysqli_fetch_array($dbc))
$user[$row['user_id']] = $i++;
$rank[] = $row['user_id'];
$gp[] = $row['grade_points'];
// the rank of user 10 is
echo "the rank of user_id 10 is $user[10]";
echo "the rank of all users are: " ;
print_r($rank);
这将累加成绩,并计算作业的数量。排序将确保从 3 个作业中获得 10 分的学生的排名高于从 4 个作业中获得 10 分的学生。
查看 COUNT SUM 和 GROUP BY 聚合。
【讨论】:
我使用的 Grade_points 等于某个等级,例如 A+ = 5 B+ = 4 等等。 但是我怎么知道学生的排名呢? 该查询将返回按排名排序的所有学生。所以查询所有学生,然后用php拉出你想要的那个。他们的排名是$gp[]
数组的关键。由于您只有 100 名学生,因此不必担心这里的效率。它将在亚微秒范围内。
你把我弄丢了,我想我走错了路,你到底在说什么。示例代码将帮助我更好地理解。谢谢。
如果我卡住了,我会尝试从这里弄清楚,我会发布另一个问题。感谢您的帮助。以上是关于如何使用 PHP 和 MySQL 显示学生在百名学生中的排名?的主要内容,如果未能解决你的问题,请参考以下文章