辛星解讀一次在mysql中獲取排名的例項

辛星發表於2015-09-09

     這裡並沒有考慮到繫結,因此我們還是使用拼湊sql語句的形式,而且並不是在mysql命令列中書寫的,很多條件我們都直接用具體的資料來代替。

     首先交代一下需求:

     (1)作業儲存在t_score表中,練習儲存在t_exercise表中。

     (2)我們需要從練習表和作業表中取出對應的學生成績,而學生資訊儲存在t_user表中。

     (3)需要知道某個學生根據某道題的正答率和時間來獲取對應的排名。

   

     然後交代一下基本知識:

     (1)對於排名,這裡沒有記錄到表中,我們使用的是@x的變數的形式,需要注意的是@x變數這種是對connection有效的,也就是它是對不同的連線有不同的值的。

      (2)對於子查詢的時候必須給被匯出的表指定別名,否則會報錯。

 

     然後我們可以分三級來做這件事:

     (1)首先把練習表和作業表的內容統一取出,得到一個新表的統一結構,程式碼如下:

    

 $sqlt = "(select ubint64_student_no,char64_integral,
          	char64_testbank_num,char64_activities_time from t_score
          	where char64_activities_no = '$gid' 
          	and char64_testbank_no = '$tbno') 
			union (select ubint64_student_no,char64_integral,
			char64_testbank_num,char64_activities_time from t_exercise
			where char64_activities_no = '$gid' 
          	and char64_testbank_no = '$tbno')  ";

   

    (2)然後取得所有的排名資訊,程式碼如下:


 $sqlz = " ( SELECT @rank := @rank + 1 as rank, 
          	t_user.ubint64_no,char64_user_name, 
          	max(char64_integral/char64_testbank_num) as right_rate,
          	min(char64_activities_time) as right_time 
          	from ( $sqlt ) as t ,t_user ,(select @rank := 0) b
          	where t.ubint64_student_no = t_user.ubint64_no 
          	group by t_user.ubint64_no ) ";


    (3)最後獲取某個學生的成績,程式碼如下:


$sqly = "select * from ($sqlz) as xin where ubint64_no = 272";


  (4)最後我們來看一下生成的程式碼吧:

select * from ( ( SELECT @rank := @rank + 1 as rank, t_user.ubint64_no,char64_user_name, max(char64_integral/char64_testbank_num) as right_rate, min(char64_activities_time) as right_time from ( (select ubint64_student_no,char64_integral, char64_testbank_num,char64_activities_time from t_score where char64_activities_no = '4' and char64_testbank_no = '1') union (select ubint64_student_no,char64_integral, char64_testbank_num,char64_activities_time from t_exercise where char64_activities_no = '4' and char64_testbank_no = '1') ) as t ,t_user ,(select @rank := 0) b where t.ubint64_student_no = t_user.ubint64_no group by t_user.ubint64_no ) ) as xin where ubint64_no = 272

    當然啦,這裡只是一個demo,只是為了完成需求而寫的一個示範程式碼,不建議直接拿到程式碼中直接使用,而且在使用它之前應該進行嚴格的引數過濾,而且還要使用繫結機制。

 

相關文章