我使用了这个查询,我认为 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/