MySQL用户排名和排序结果

时间:2017-05-25 08:53:44

标签: mysql ranking

我有以下mysql语句来返回前10位用户数据以及登录用户的数据(如果登录用户位于前10位,那么总共只有10个结果,否则&&; #39; s 11)...

(SELECT user_id, points, amountLikes, amountComments
FROM all_scores_table
ORDER BY points desc, amountLikes desc, amountComments desc
LIMIT 0,10)

UNION

(SELECT user_id, points, amountLikes, amountComments
FROM all_scores_table
WHERE user_id = $session_user_id)

ORDER BY points desc, amountLikes desc, amountComments desc

all_scores_table每个用户只有1行。我现在正尝试将排名信息添加到第二个查询中(例如,如果有11行,我想知道session_user_id在列表中是第11位还是第468位)。

我已经阅读过一些相似的帖子,但无法找到一个答案似乎适用于我通过联合排序结果编写初始查询的方式 - 例如我不能只添加一个点数大于我的用户的简单行数,因为如果他们甚至我想引用amountLikes,那么还是要查看真正的订单。

我当然可以在PHP中使用第二个查询来执行此操作,但我希望有人注意到在mysql中实现此目的的优雅方法

1 个答案:

答案 0 :(得分:1)

我建议尝试聪明并使用一个查询。相反,只需进行两个查询,一个查找前十个,另一个查找登录用户及其数字排名。对于第一个查询,您可以使用已有的内容:

SELECT
    user_id, points, amountLikes, amountComments
FROM all_scores_table
ORDER BY points DESC, amountLikes DESC, amountComments DESC
LIMIT 10

对于分配排名,当您迭代结果集时,可以在PHP代码中轻松处理此问题。只需使用从1开始的变量计数器。

要获得当前登录用户的排名,需要做更多的工作,因为他可能被埋没在数百(或更多)记录中。一种选择是使用会话变量:

SET @row_number = 0;

SELECT 
    (@row_number:=@row_number + 1) AS rank,
    user_id, points, amountLikes, amountComments
FROM all_scores_table
WHERE user_id = $session_user_id
ORDER BY points DESC, amountLikes DESC, amountComments DESC

第二个查询应返回单个记录(假设每个用户只出现一次),其中包含您需要的元数据以及数字排名。

在PHP逻辑中,您可以检查排名是否在前十名,如果是,则不会在表格的底部显示这个额外的单个记录。