2012-07-13 31 views
0

我很努力与MySQL查询。请帮帮我。 这是我的查询,我得到正确的结果,但我需要在MySQL中修改结果。如何添加排名,基于在mysql中的点

   SELECT bu.username, 
        bg.id as goal_id, 
        br.id as reason_id, 
        (SELECT COUNT(test_reason_id) FROM test_rank WHERE test_reason_id = br.id) as point 
       FROM 
        test_goal AS bg INNER JOIN test_reason AS br ON 
        br.user_id=bg.user_id INNER JOIN test_user AS bu ON 
        br.user_id=bu.id 
       WHERE 
        bg.id  = br.test_goal_id 
       GROUP BY 
        bg.id 
       ORDER BY 
        point DESC 

于此项目表格-1 我实际的表看起来像这样当我使用ORDER BY点DESC那么它看起来像表2

username  goal_id reason_id point 
khan   8   3  2 
john   6   9  5 
yoyo   5   21  4 
smith   11   6  5 

于此项目表格-2 我的结果看起来像这样

username  goal_id reason_id point 
john   6   9  5 
smith   11   6  5 
yoyo   5   21  4 
khan   8   3  2 

但我想要我的结果集像这样

username  goal_id reason_id point rank 
john   6   9  5  1 
smith   11   6  5  2 
yoyo   5   21  4  3 
khan   8   3  2  4 

这是可能的吗?请任何人都可以帮助我。对我来说太难了。

回答

3

添加一行计数变量是这样的:

select a.*, (@row := @row + 1) as rank 
from (
     SELECT bu.username, 
       bg.id as goal_id, 
       br.id as reason_id, 
       (SELECT COUNT(test_reason_id) FROM test_rank WHERE test_reason_id = br.id) as point     
      FROM 
       test_goal AS bg INNER JOIN test_reason AS br ON 
       br.user_id=bg.user_id INNER JOIN test_user AS bu ON 
       br.user_id=bu.id      
      WHERE 
       bg.id  = br.test_goal_id 
      GROUP BY 
       bg.id 
      ORDER BY 
       point DESC 
) a, (SELECT @row := 0) r 

对于总是被那么快见this simplified SQLFiddle example

+0

+1:d – 2012-07-13 08:08:52

+0

:(排名不能正常工作,我需要ORDER BY DESC点和等级ASC – yogi46 2012-07-13 08:47:52

+1

你可以在[sqlfiddle](http://sqlfiddle.com)上提供一个例子吗? – 2012-07-13 08:50:23