Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 优化MySQL查询,在单个查询中查找不同测试的用户排名_Php_Mysql_Sql - Fatal编程技术网

Php 优化MySQL查询,在单个查询中查找不同测试的用户排名

Php 优化MySQL查询,在单个查询中查找不同测试的用户排名,php,mysql,sql,Php,Mysql,Sql,我使用查询来查找给定测试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中用户的排名,这一次只为一个测试提供排名,我必须使用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_idsay的所有级别的用户,为user_Id=$my_user_idsay的用户将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

我们引入了一个额外的变量@user来重置用户id更改时的@rownum

最简单的可能是删除用户变量进行排名,然后使用子查询来完成

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';

.

您能添加一些简单的样本数据和期望的结果吗?我不太清楚您希望查询的输出是什么样子。假设我们需要在测试类型1中找到user_id=32的排名,此处user id相同,因此我们需要重置test_id?如何将其与另一个表连接。。通过选择测试类型..要设置我的测试ID,您可以为您提供的样本数据在问题中添加样本结果吗?在你的问题中,你从来没有提到过这一点,我也不明白你到底在找什么。它很管用。。只需要连接两个表..其中我的测试id将从测试类型中获取..例如,对于测试类型1,我们需要找到。。我必须找到Test_Type_Id=$my_Test_Type_idsay的所有级别的用户,对于user_Id=$my_user_idsay的用户,将a.Id与b.my_Test_Id合并在一起,您可以在此处查找所有测试,但我只需要查找特定类型的测试…选择,从User_Date_表b中选择COUNT+1,其中a.my_test_id=b.my_test_id和a.test_scoreSELECT *, (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';