0

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

假设我有一个如下表:

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 做同样的事情,但我正在努力迭代用户和培训。希望你能在那里帮助我。

4

1 回答 1

0

以下查询使用变量在 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两个变量赋值之前被评估。在实践中,它们是按顺序评估的,但这并不能保证。

于 2013-07-26T16:49:37.680 回答