从列表中为每个帐户ID获取一行

时间:2008-09-18 17:52:38

标签: sql mysql database

我有一个包含游戏分数的表格,每个帐户ID允许多行:scores (id, score, accountid)。我想要一份前十名得分手ID和他们的分数列表。

您是否可以提供一个sql语句来选择前10个分数,但每个帐户ID只能获得一个分数?

谢谢!

6 个答案:

答案 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输入了分数。