我有一个包含游戏分数的表格,每个帐户ID允许多行:scores (id, score, accountid)
。我想要一份前十名得分手ID和他们的分数列表。
您是否可以提供一个sql语句来选择前10个分数,但每个帐户ID只能获得一个分数?
谢谢!
答案 0 :(得分:4)
select username, max(score) from usertable group by username order by max(score) desc limit 10;
答案 1 :(得分:2)
试试这个:
select top 10 username,
max(score)
from usertable
group by username
order by max(score) desc
答案 2 :(得分:2)
首先将选择限制为每个帐户ID的最高分数。 然后取十大分数。
SELECT TOP 10 AccountId, Score
FROM Scores s1
WHERE AccountId NOT IN
(SELECT AccountId s2 FROM Scores
WHERE s1.AccountId = s2.AccountId and s1.Score > s2.Score)
ORDER BY Score DESC
答案 3 :(得分:1)
PostgreSQL有DISTINCT ON子句,它以这种方式工作:
SELECT DISTINCT ON (accountid) id, score, accountid
FROM scoretable
ORDER BY score DESC
LIMIT 10;
我认为它不是标准的SQL,所以期望其他数据库以不同的方式进行。
答案 4 :(得分:1)
SELECT accountid, MAX(score) as top_score
FROM Scores
GROUP BY accountid,
ORDER BY top_score DESC
LIMIT 0, 10
这应该在mysql中正常工作。您可能需要使用'ORDER BY MAX(得分)DESC'而不是该命令 - 我手头没有我的SQL参考。
答案 5 :(得分:0)
我相信PostgreSQL(至少8.3)将要求DISTINCT ON
表达式必须匹配初始ORDER BY
表达式。 I.E.如果您有DISTINCT ON (accountid)
,则无法使用ORDER BY score DESC
。要解决此问题,请将其添加到ORDER BY
:
SELECT DISTINCT ON (accountid) *
FROM scoretable
ORDER BY accountid, score DESC
LIMIT 10;
使用此方法可以选择表格中的所有列。即使分数的“最大值”重复,它也只会返回每行1行。
这对我很有用,因为我没有找到最高分(这对于max()函数来说很容易),但是最近一次为accountid输入了分数。