MySql 查询示例

标签 mysql

我使用了这个查询,我认为 mysql 服务器崩溃了或者什么的。现在无法到达。这是巧合还是我的查询太糟糕了?如果坏了我该如何修复它

处理 400.000 行 2 个表,一个是分数列表,另一个是用户

SELECT a.* 
from 
(
    SELECT @curRank := @curRank +1 AS ROW , s.UserId,
       s.AverageScore As Score, u.UserName 
    FROM  scorelisting s, (SELECT @curRank :=0) r, Users u 
    where u.UserId=s.UserId 
    order by AverageScore desc
) a 
where UserId = 95890

最佳答案

我不知道我是否过于简化了这一点,但是...如果您正在寻找特定用户在其他用户中的排名,我会找出该人的“averageScore”是什么,然后获取 COUNT(*) 条平均优于您想要的记录的所有记录,然后获取该人的名字...有意义吗?然后尝试以下操作。

<强> REVISED AND TESTED -- SQL FIDDLE SQLFiddle 上的示例有 6 个用户 a-f 条目,平均分数分别为 10-60。该查询选择用户 3 (avgScore),因此 3(d、e 和 f)具有更高的平均值(40、50、60),这将用户“c”(id 3)排在第四位。

SELECT 
      u.UserName,
      PreQuery.AverageHigherThanYou +1 as UserRank
   from
      users u,
      ( select
              COUNT(*) as AverageHigherThanYou
           from 
              scoreListing s,
              ( select @MyAvg := s2.AverageScore
                   from scoreListing s2 
                   where s2.UserID = 95890 ) sqlvars
            where
               s.AverageScore > @MyAvg ) PreQuery
    where
       u.userid = 95890

“预查询”只是获取所有小于特定用户静态连接到 ScoreListing 的计数,并将其放入单个列值中。

然后,逗号用户表(旧的 ANSI,无连接条件)将始终返回一条记录...然后,仅在 USER 表上应用 WHERE 子句,以获取一个人的姓名信息。

现在,如果您想知道有多少个是较高、相同或较低的平均值,您可以调整查询,例如

  ( SELECT 
          sum( if( s.averageScore < s2.averageScore, 1, 0 )) as LowerAverageThanYou,
          sum( if( s.averageScore = s2.averageScore, 1, 0 )) as SameAverageAsYou,
          sum( if( s.averageScore > s2.averageScore, 1, 0 )) as HigherAverageThanYou
       from 
          scoreListing s
             join scoreListing s2
                ON s2.UserID = 95890 ) PreQuery,

您显然必须等到您的计算机被释放才能重试。

我还会在 ScoreListing 表上有两个索引。一个仅在 ID 上跳转到 UserID = 95890 记录以比较该人的平均值,另一个在 AverageScore 上,因此如果您仅执行 HIGHER THAN,则您的 WHERE 子句只需扫描这些记录,而不是整个 400,000 条记录。

关于MySql 查询示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13556546/

相关文章:

MySQL 在 where 子句中分配用户定义的变量

mysql - 在 mysql 数据库中存储友谊协会的正确方法是什么

MySQL如何加入同一个表,包括丢失的行

php - 当 URL 中包含 “” 时,为什么通过 URL 从 MySQL 获取数据不起作用?

Mysql:替换文本中的前导零

mysql - 在 Rails 应用程序上进行全站搜索

python - 如何在 python 中从 peewee 调用 mysql 过程

mysql - 有没有办法选择不存在值的规范化数据

mysql - SQL INNER JOIN 没有返回我需要的内容

PHP/MySQL 资源使用