【问题标题】:MySQL how to get user rank by votes amountMySQL如何通过投票量获得用户排名
【发布时间】:2015-02-26 07:36:33
【问题描述】:

我有两张桌子。一个“用户”和一个“投票”,每个用户可以有 n 票。现在我选择一个用户列表并输出它。 它适用于 LEFT JOIN 中的 COUNT 投票,但现在我想计算用户的 RANK(第 1、第 2、第 3、...)。

理论上,ORDER BY Votes 很容易,但我也允许我的用户按用户日期排序(当他们加入时)。而且我的查询中还有一个带有 LIMIT 的分页。那么如何才能最好地解决这个问题呢?

$user_sql   = $db->query("SELECT u.*, COUNT(v.voteId) AS user_votes 
                          FROM cs_users AS u
                          LEFT JOIN cs_users_votes AS v 
                          ON u.userId = v.voteUserId");

(基本查询,但会添加分页和排序器 ORDER BY / LIMIT 等)

希望你能帮忙!

【问题讨论】:

  • 我对“感到困惑,但我也允许我的用户按用户日期排序(当他们加入时)。”???
  • 我的意思是,当我按用户日期排序时,我不能使用 MySQL 输出的顺序来获得排名,比如计算 $i++;每个用户,以获得排名。使用 LIMIT 时同样的问题
  • 排名是根据票数吗?
  • 你试过这个吗 SELECT u.*, COUNT(v.voteId) AS user_votes FROM cs_users AS u LEFT JOIN cs_users_votes AS v ON u.userId = v.voteUserId order by votes desc, date desc;
  • @habibulhaq 将如何显示排名?

标签: php mysql


【解决方案1】:

好吧,要计算排名,您可以使用here 找到的排名功能 它将考虑结果关系对每个用户进行排名。如果您添加分页,您可能会尝试以递归方式传递上一页的结果。

至于函数本身

SET @curRank :=0, @prevRank := NULL;
SELECT u.*, COUNT(v.voteId) AS user_votes,
CASE 
WHEN @prevRank = id THEN @curRank 
WHEN @prevRank := id THEN @curRank := @curRank + 1
END AS rank
FROM cs_users AS u
LEFT JOIN cs_users_votes AS v 
ON u.userId = v.voteUserId

【讨论】:

  • 很好,但我想你已经忘记了 ORDER BY 和 LIMIT 部分。 OP的分页方式对这个查询会有什么影响?
  • 是的。我只是想展示排名本身的想法,而不是给出确切的解决方案。关于分页 - 有几种解决方案 - 我个人会使用我给出的查询制作一个包含所有 RANKS 的 TEMP 表,然后向其中添加分页。表本身可以重建,例如每小时或基于事件(例如新投票)。这也将显着提高查询速度,因为不需要进行任何 JOIN,只需从普通表中查询
猜你喜欢
  • 2013-01-20
  • 2022-11-23
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多