我的前端 (SourcePawn) 目前执行以下操作:
float fPoints = 0.0;
float fWeight = 1.0;
while(results.FetchRow())
{
fPoints += (results.FetchFloat(0) * fWeight);
fWeight *= 0.95;
}
如果您不理解这段代码,它会遍历此查询的结果集:
SELECT points FROM table WHERE auth = 'authentication_id' AND points > 0.0 ORDER BY points DESC;
结果集为 float ,按点数
从高到低排序。
我的前端取第一行的100%,然后是第二行的95%,每次下降5%。所有这些加起来就是我的“总和”变量 fPoints
。
我正在寻找的是如何在纯 SQL 中复制此代码并在我的前端接收称为 fPoints
的总和的解决方案,因此我将能够运行它适用于一个超过 10,000 行的表,在一个查询中而不是 10,000。
我很迷茫。我不知道从哪里开始,任何形式的指导都会非常好。
最佳答案
您可以使用变量来做到这一点:
SELECT points,
(points * (@f := 0.95 * @f) / 0.95) as fPoints
FROM table t CROSS JOIN
(SELECT @f := 1.0) params
WHERE auth = 'authentication_id' AND points > 0.0
ORDER BY points DESC;
关于计算的注释。 @f
的值从1开始。因为我们是在处理变量,变量的赋值和使用需要在同一个表达式中——MySQL不保证表达式求值的顺序.
因此,0.95 * @f
将值降低了 5%。但是,这是针对下 迭代的。 /0.95
撤消该操作以获得此 迭代的正确值。
关于mysql - 纯SQL中权重的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38798008/