希望你能帮助我解决我正在努力解决的数据库问题:)
假设我有一个如下表:
id | user_id | training_id | date | performance | best
1 | 7042 | 11 | 2013-07-23 13:43:29 | 654 | true
2 | 7042 | 11 | 2013-07-25 15:22:59 | 703 | false
3 | 2344 | 12 | 2013-07-26 09:20:12 | 400 | true
...
该表包含用户 (user_id) 已完成的培训 (training_id)。当用户以比所有以前的同类训练(training_id)更好的性能免除训练时,他就有了最好的(best = true)。我现在想添加一个辅助列“last_best”,以便我可以查询给定用户每次训练的最后一个最佳结果。为了提供缺少的 last_pb 的值,我想对数据库中的所有训练运行一个脚本。
我的第一个方法是迭代 Rails 控制台中的所有培训和用户。然而这种方法确实很慢。对于包含约 70,000 个用户和 200,000 次训练的数据集,大约需要 36 小时。
现在我想对 SQL 做同样的事情,但我在迭代用户和培训方面遇到了困难。 希望你能帮助我。
最佳答案
以下查询使用变量在 MySQL 中进行排名:
select t.*,
@rn := if(@user_id <> USER_ID or @training_id <> training_id, @rn + 1, 1) as ranking,
@user_id := user_id,
@training_id := training_id
from t cross join
(select @user_id := -1, @training_id := -1, @rn := 0) const
order by USER_ID, training_id, performance desc;
对于您想要做的事情来说,这无疑是最有效的方法。一句警告。尽管它在实践中有效,但存在一个问题。 MySQL 不保证参数求值的顺序。该查询取决于在两个变量赋值之前评估的ranking
。在实践中,它们是按顺序评估的,但这并不能保证。
关于mysql - 迭代数据集以更新 mysql 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17883735/