Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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
Mysql 获取用户排名的SQL查询_Mysql_Sql_Ranking - Fatal编程技术网

Mysql 获取用户排名的SQL查询

Mysql 获取用户排名的SQL查询,mysql,sql,ranking,Mysql,Sql,Ranking,我试图在Mysql中执行一个查询,以获得用户的所有时间排名。 对于本月排名,我通过以下请求成功完成: SELECT MAX(x.rank) AS rank FROM (SELECT t.id_user, @rownum := @rownum + 1 AS rank FROM screengame_points t JOIN (SELECT @rownum := 0) r

我试图在Mysql中执行一个查询,以获得用户的所有时间排名。 对于本月排名,我通过以下请求成功完成:

SELECT MAX(x.rank) AS rank
  FROM (SELECT 
               t.id_user,
               @rownum := @rownum + 1 AS rank
          FROM screengame_points t
          JOIN (SELECT @rownum := 0) r
          WHERE month = $month
      ORDER BY t.points DESC) x
 WHERE x.id_user = 4
一直以来,我都需要计算所有点的总和,所以我尝试:

SELECT MAX(x.rank) AS rank
  FROM (SELECT 
               t.id_user,
               @rownum := @rownum + 1 AS rank
          FROM screengame_points t
          JOIN (SELECT @rownum := 0) r
    GROUP BY id_user
      ORDER BY sum(t.points) DESC) x
 WHERE x.id_user = 4
(请注意“按id_用户分组”和“总和(t点)”)

但它不起作用。我认为第二个请求中的排名结果是从一个月内得分最高的一个到最差的一个。这不是一个月所有积分的总和


我该怎么做呢?

我怀疑问题在于,在这两种情况下,
orderby
都被优化了。在第一种情况下,你可能很幸运

MySQL文档确实指出,子查询中允许使用
orderby
。然而,关于
联合
有一个有趣的讨论

但是,对单个SELECT语句使用ORDER BY意味着 与行在最终结果中的显示顺序无关 因为默认情况下,UNION生成一组无序的行。所以,, 在这种情况下,ORDER BY的使用通常与 限制,以便用于确定选定行的子集 为SELECT检索,即使它不一定会影响 这些行在最终联合结果中的顺序。如果出现“订购方式” 在选择中没有限制,它被优化了,因为它将 反正没有效果

我强调这是关于联合条款;我找不到关于简单子查询的任何内容。但是,标准SQL中不允许按排序,最外层除外。原因很简单。表和子查询是无序的

您可以通过在子查询中包含
LIMIT
子句来欺骗MySQL。输入足够大的数量以获得所有用户(尽管理论上可以优化)


您还有两个其他选项可以获取此信息。如果表不是太大,可以使用自连接来获取排名信息。也可以插入到具有自动增量列的临时表中;我认为按订购的
在那里可以用。(我不考虑切换数据库,因为几乎所有其他数据库都支持
rank
功能。)

我找到了一个解决方案,但我认为我的查询执行速度可能会很慢,记录太多

SELECT WrappedQuery.rank 
FROM (SELECT @rownum := @rownum +1 as rank, id_user
      FROM ( select @rownum := 0 ) sqlvars,
           (SELECT  t.id_user
            FROM screengame_points t
        GROUP BY id_user
            ORDER BY sum(t.points) DESC
        ) x 
     ) WrappedQuery
WHERE id_user = 4

极限并不能解决问题。奇怪的是,如果我只执行我的子查询,第一行实际上是第一个用户id,但是关联的排名是错误的。我可以得到如下结果:{id\u user:4,rank:2}{id\u user:1,rank:1},我的结果应该是{id\u user:4,rank:1}{id\u user:1,rank:2}