2010-06-18 124 views
0

我試圖讓一個學生的排名達到一百級,我想能夠顯示學生的排名。如何使用PHP和MySQL顯示百名學生中的學生排名?

我試圖通過年級和年級得分的學生的排名。例如,如果student 1具有2個A +等級並且總共10個點並且student 2具有3個B-等級並且總共10個點student 1將排列更高。我想知道如何使用PHP & MySQL來做到這一點?

這是我到目前爲止的PHP代碼&。

$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) 
); 
+0

你可以做的是看看有多少年級 - 分數的數量 - 每個學生都有,並按此Asc然後按實際分數排序。例如:student1有2個A +而student2有3B-因此他們都有10個點。但是,學生只有2個等級給了他10分,所以這意味着學生應該有更高的等級。 – 2010-06-18 22:07:49

回答

2

修訂

你需要的總和。做一個SUM()和COUNT()。 COUNT會告訴你分配的次數,總和會告訴你總分數。 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聚合。

+0

我使用的grade_points等於某個等級,例如A + = 5 B + = 4等等。 – codeMONKEY 2010-06-18 21:46:41

+0

但我怎麼知道學生在哪裏排名? – codeMONKEY 2010-06-18 21:53:46

+0

該查詢將返回按排名排序的所有學生。因此,查詢所有學生,然後使用PHP來取出你想要的。他們的等級是'$ gp []'數組的關鍵。由於你只有100名學生,所以不要擔心效率。它將在亞微秒範圍內。 – 2010-06-18 22:15:29

相關問題