选择分组到特定标识符的值

时间:2020-03-06 14:34:25  来源:igfitidea点击:

我有一个可以在游戏中追踪高分的应用程序。

我有一个user_scores表,将user_id映射到分数。

我需要返回5个最高分数,但对于任何特定用户,仅返回1个最高分数。

因此,如果单纯以数字为基础,用户X的最高得分为5,那么我只返回最高得分,然后再返回接下来的4个用户得分。

我尝试使用:

SELECT user_id, score 
FROM user_scores 
ORDER BY score DESC 
GROUP BY user_id 
LIMIT 5

但是,似乎MySQL丢弃了得分高于1的任何user_id。

解决方案

没有汇总功能(SUM,COUNT等),我们将无法分组

GROUP BY子句说明如何对SUM或者COUNT进行分组。

如果我们只是想将长列表分成具有共同值的一堆,那不是SQL。这就是应用程序所要做的。

你能用Distinct运算符说

SELECT DISTINCT(user_id), score
FROM user_scores
ORDER BY score DESC
LIMIT 5

没有测试,所以不确定是否一定能正常工作

这应该工作:

SELECT user_id, MAX(score)
FROM user_scores 
GROUP BY user_id 
ORDER BY MAX(score) DESC 
LIMIT 5

仅返回给定用户的最大分数类似于以下内容。

SELECT user_id, max(score) FROM user_scores
GROUP BY user_id

SELECT user_id, MAX(score) AS score
FROM user_scores 
GROUP BY user_id
ORDER BY score DESC
LIMIT 5

应该为我们完成工作...尽管不要忘记创建索引...

我不知道这是缺乏咖啡因还是仅仅是大脑爆炸,但答案很简单。

实际上,我已经将它与这种怪兽一起使用了:

SELECT s1.user_id, 
    (SELECT score FROM user_scores s2 WHERE s2.user_id = s1.user_id ORDER BY score DESC LIMIT 1) AS score 
FROM user_scores s1         
GROUP BY s1.user_id
ORDER BY s1.score DESC        
LIMIT 5