繁体   English   中英

优化MySQL查询以在单个查询中找到用户进行differnet测试的等级

[英]Optimize MySQL query to find rank of a user for differnet tests in single query

我正在使用查询查找给定测试ID中用户的排名,这一次只给我一个测试的排名,我必须使用foreach来获取所有测试的测试排名。

SELECT * , t.UserRank
FROM (

SELECT * , (
@rownum := @rownum +1
)UserRank
FROM User_Date_Table, (

SELECT @rownum :=0
)t
WHERE my_test_id  = '$test_id'
ORDER BY test_score DESC
)t
WHERE user_id = '$my_user_id' 

可以生成一个查询,该查询可以为我在单个查询中用户进行的所有测试提供用户排名,因为这将减少数据库命中的次数。

我必须找到具有Test_Type_Id = $ my_test_type_id(say)的所有用户等级,并为具有user_id = $ my_user_id(say)的用户加入a.id与b.my_test_id

TABLE STRUCTURE

  My_Test_Table (a)

  id  |  name   |  Test_Type_Id 
  ----------------------------------------------
  1  |  name_1  |  1
  2  |  name_2  |  1    
  3  |  name_3  |  2    
  4  |  name_4  |  1    
  5  |  name_5  |  1
  6  |  name_6  |  2    
  7  |  name_7  |  1    
  8  |  name_8  |  2    
  9  |  name_9  |  1



 User_Date_Table (b)

id  | my_test_id | user_id  | test_score
---------------------------------------------------------
1  | 1  | 32    | 34
2  | 1  | 2     | 345
3  | 2  | 4     | 654
4  | 1  | 76    | 87
5  | 3  | 23    | 453
6  | 2  | 5     | 45
7  | 1  | 43    | 22
8  | 2  | 7     | 987
9  | 2  | 32    | 45
10  | 1     | 1     | 12
11  | 1     | 9 | 35
12  | 3     | 67    | 765
13  | 1     | 88    | 23
14  | 2     | 34    | 76
15  | 3     | 1     | 765
16  | 2     | 54    | 45
17  | 1     | 10    | 87
18  | 1     | 23    | 3
19  | 3     | 44    | 345
20 | 1  | 55    | 232
21  | 2     | 28    | 234
22  | 3     | 32    | 231

最简单的方法可能是删除用户变量进行排名,然后使用子查询进行操作。

SELECT *, (SELECT COUNT(*)+1 
           FROM User_Date_Table b 
           WHERE a.my_test_id = b.my_test_id
             AND a.test_score < b.test_score) userrank
FROM User_Date_Table a
WHERE user_id = '1';

要使用进行测试的SQLfiddle

SELECT * , t.UserRank
FROM (    
    SELECT * , @rownum :=if(@user!=user_id,0, @rownum +1),@user:=user_id UserRank
    FROM User_Date_Table , (SELECT @rownum :=0,@user :=-1) t
    ORDER BY my_test_id ,test_score DESC
    )t
WHERE user_id = '$my_user_id' 

我们引入了另一个变量@user,以在user_id更改时重置@rownum

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM