mysql - 迭代数据集以更新 mysql 中的列

标签 mysql ruby-on-rails

希望你能帮助我解决我正在努力解决的数据库问题:)

假设我有一个如下表:

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/

相关文章:

ruby-on-rails - 带迭代器的 Rails 助手

ruby-on-rails - 在 Rails Controller 测试中,有没有办法传递 action 参数?

ruby-on-rails - 如何判断GIF是不是动画?

ruby-on-rails - PG::ConnectionBad FATAL:角色 "Myname"不存在

mysql - grails/hibernate 是否在 PostgreSQL 中存储以毫秒为单位的日期?

python - 如何检查数据库是否存在于 PyMySQL 中

mysql - 何时在sql中执行聚合函数(例如sum(),max()..等)

MYSQL 按过去 10 分钟对日期间隔进行分组

python - 如何删除 SQLAlchemy 中的外键约束?

ruby-on-rails - 如何用ruby写一个爬虫?