mysql - 纯SQL中权重的使用

标签 mysql sql

我的前端 (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/

相关文章:

python - 将复杂的 json 对象插入到 sql 模式中

sql - 如何根据每天的日常设备使用情况对 id 进行分割

sql - 使用完全外部连接查看

mysql - 在 WHERE 子句中使用 % WILD

mysql - 如何减少mysql查询运行时间

php - PDO SQL 查询中的无效参数

php - 将实时 XML 提要导入 MySQL 数据库?

PhpStorm MySQL 使用 DB 未定义

sql - While循环问题

sql - 有没有更有效的方法返回匹配最大值的记录?