选择分组到特定标识符的值
时间: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