首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >迭代数据集以更新mysql中的列

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

Stack Overflow用户
提问于 2013-07-26 14:14:54
回答 1查看 88关注 0票数 0

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

假设我有一张表如下:

代码语言:javascript
运行
复制
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)已免除的培训(User_id)。当用户以比以前的所有此类培训(training_id)更好的性能解除训练时,他有最好的(最好=真)。现在,我想添加一个辅助列'last_best‘,这样我就可以为给定的用户查询每个培训的最后最佳结果。为了提供缺少last_pb的值,我希望在数据库中的所有培训上运行一个脚本。

我的第一种方法是迭代rails控制台中的所有培训和用户。然而,这种方法确实很慢。一个大约有70.000名用户的数据集和200.000次培训需要大约36个小时。

现在,我想对SQL也做同样的事情,但是我很难在用户和培训中迭代。希望你能帮我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-26 16:49:37

以下查询使用变量在MySQL中进行排序:

代码语言:javascript
运行
复制
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。在实践中,它们是按顺序进行评估的,但这并不能得到保证。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17883735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档