MySQL 排序结果的用户排名

MySQL user rank with sorted results

我有以下 mysql 语句来返回前 10 个用户数据以及登录用户的数据(如果登录用户在前 10 个中,则只有 10 个结果总计,否则有 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、amountComments 来找到真正的顺序。

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

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

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

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

在你的PHP逻辑中,你可以检查排名是否在前十,如果是,则不在你的table底部显示这条多出的单条记录。