希望您能帮助我解决我正在努力解决的数据库问题:)
假设我有一张表如下:
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也做同样的事情,但是我很难在用户和培训中迭代。希望你能帮我。
发布于 2013-07-26 16:49:37
以下查询使用变量在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
。在实践中,它们是按顺序进行评估的,但这并不能得到保证。
https://stackoverflow.com/questions/17883735
复制相似问题