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

Fetch one row per account id from list

提问人:Kenzie 提问时间:9/19/2008 更新时间:9/6/2017 访问量:6180

问:

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

你能提供一个sql语句来选择前10个分数,但每个账户ID只有一个分数吗?

谢谢!

SQL MySQL 数据库

评论


答:

2赞 Danimal 9/19/2008 #1

试试这个:

select top 10 username, 
              max(score) 
from usertable 
group by username 
order by max(score) desc

评论

1赞 zigdon 9/19/2008
“前 10 名”是新的吗?我不记得以前看过吗?
0赞 Danimal 9/19/2008
依赖于 DBMS -- 它是 2000 年 SQL Server 的新增功能
1赞 Neall 9/19/2008 #2

PostgreSQL 有 DISTINCT ON 子句,其工作方式如下:

SELECT DISTINCT ON (accountid) id, score, accountid
FROM scoretable
ORDER BY score DESC
LIMIT 10;

不过,我不认为这是标准的SQL,所以希望其他数据库以不同的方式做到这一点。

4赞 zigdon 9/19/2008 #3
select username, max(score) from usertable group by username order by max(score) desc limit 10;
2赞 Eclipse 9/19/2008 #4

首先,将选择限制为每个帐户 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

评论

0赞 Kenzie 9/21/2008
事实证明,这似乎更好,因为它选择了整行。另一个 max 查询仅将 max 分数附加到每个 accountid 的随机行。
0赞 Kenzie 9/21/2008
修复:SELECT * FROM scores s1 WHERE accountid NOT IN (SELECT accountid FROM scores s2 WHERE s1.accountid = s2.accountid and s1.score < s2.score) ORDER BY score DESC
2赞 Kenzie 9/25/2008
我在这个查询中唯一剩下的问题是,当该帐户有不止一次出现其最高分时,我每个帐户ID都会获得不止一行。因此,如果 accoundid 6 的分数为 50、75、40、75,则查询将返回分数为 75 的两行。
1赞 John Fiala 9/21/2008 #5
SELECT accountid, MAX(score) as top_score
FROM Scores
GROUP BY accountid,
ORDER BY top_score DESC
LIMIT 0, 10

这在mysql中应该可以正常工作。您可能需要使用“ORDER BY MAX(score) DESC”而不是该顺序 - 我手头没有 SQL 引用。

0赞 orbitaudio 7/23/2009 #6

我相信PostgreSQL(至少8.3)将要求表达式必须与初始表达式匹配。即当你有 .要解决此问题,请将其添加到:DISTINCT ONORDER BYDISTINCT ON (accountid)ORDER BY score DESCORDER BY

SELECT DISTINCT ON (accountid) *
FROM scoretable
ORDER BY accountid, score DESC
LIMIT 10;

使用此方法可以选择表中的所有列。即使存在重复的 score “max” 值,它也只会为每个 accountid 返回 1 行。

这对我来说很有用,因为我没有找到最高分数(使用 max() 函数很容易做到),但最近一次为 accountid 输入了分数。