2017-05-25 121 views
1
MySQL用户排名

我有以下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位)。

我读了一堆类似的帖子,但无法找到,似乎适用于我已经unioning分类结果书面我的初始查询的方式回答 - 例如我不能只添加点数大于我的用户的简单行数,因为如果他们甚至想引用amountLikes和amountComments来查找真实的顺序。

我当然可以做到这一点在PHP与第二查询,但我希望有人注意到一个优雅的方式,仅

回答

1

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:[email protected]_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逻辑,你可以检查排名进入前十位,并且,如果是这样,不是在你的表的底部显示此额外的单记录。

+0

感谢蒂姆,但我不明白这是如何返回等级信息 - 有没有其他列,所以我怎么会知道,如果用户是第11或第468? – d3wannabe

+0

@ d3wannabe我更新了我的答案。我建议坚持使用您的第一个十大查询,在您的PHP代码中分配排名,然后使用会话变量获取当前登录用户的排名。 –