如何从一个表格计算每个用户的最佳排名,并插入/更新结果另一个表格

时间:2015-09-21 18:50:06

标签: php mysql

我有一个排名委员会,为每个性别男性和女性提供最好的前100个博客。

我有一个博客表:

PRIMARY
blogs_id  users_id  blogs_score  blogs_score_time      gender
    1         11        2852     2015-09-09 05:21:51     m <-- same score but older date
    2         23        2146     2015-09-10 07:31:54     m
    3         23        2146     2015-09-10 07:32:26     m
    4         23        2852     2015-09-10 04:42:15     m <-- same score but newer date
    5         51        1793     2015-09-11 08:15:55     f
    6         88        2947     2015-09-11 09:33:18     f 

我有一个用户表:

PRIMARY
 id  best_rank  gender
 11      0         m
 23      0         m
 51      0         f
 88      0         f

我需要为博客表中的每个用户COUNT最佳排名(使用MAX(blogs_score)和MAX(blogs_score_time)),并使用用户表 INSERT / UPDATE排名最高的每个性别的前100位用户的最佳排名,结果应为:

PRIMARY
 id  best_rank  gender
 11      2         m
 23      1         m
 51      2         f
 88      1         f

每个性别的最佳等级

最后的想法是在用户的个人资料中显示排名位置,一旦有人投票(博客表中blogs_score更改),best_rank表中的users列必须更新所有在特定性别群体中排名最高的100位用户的新排名重新计算。

如何根据我的需要调整和修复此(不工作)查询?

 $sql->query("UPDATE users
                JOIN (SELECT b.users_id,
                             @curRank := @curRank + 1 AS rank,
                             MAX(blogs_score), MAX(blogs_score_time)
                      FROM blogs b
                             JOIN (SELECT @curRank := 0) r
                      ORDER BY  b.blogs_score DESC, p.blogs_score_time DESC LIMIT 100
                ) ranks ON (ranks.users_id = users.id)
             SET users.best_rank = ranks.rank");

请帮我解决问题。我没有在stackoverflow上找到任何类似的解决方案,单独编写这样的查询对我来说似乎很复杂。

提前多多感谢!

2 个答案:

答案 0 :(得分:0)

好的......这是我的最新消息:)

我不知道你想如何使用日期字段,但是row_number与分区一起做你需要做的事情吗?

let location = CLLocation(latitude: 55.676251, longitude: 12.580570) //Christiansborg Palace, chosen since it is relatively near the other locations, to make it obvious whether results are sensible or not

let orgSorter = OrganizationSorter()

let sortedLocations = orgSorter.sortOrganizationsByDistanceFromLocation(orgArray, location: location)

for org in orgArray {
  print(org.name)
}

print("\n")

for org in sortedLocations {
  print(org.name)
}

答案 1 :(得分:0)

为了得出你想要的结果,我会使用以下内容:

SELECT users_id, MAX(blogs_score), gender
FROM blogs
GROUP BY users_id, gender
ORDER BY blogs_score_time DESC

结果:

users_id  MAX(blogs_score) gender
88        2947             f      <-- first F
51        1793             f      <-- second F
23        2852             m      <-- first M
11        2852             m      <-- second M