Mysql SQL查询以返回一列被另一列“分组”的三个最高值

Mysql SQL查询以返回一列被另一列“分组”的三个最高值,mysql,sql,Mysql,Sql,假设我有一张这样的桌子: Player Score A 5 B 4 A 3 B 2 A 1 B 1 A 2 B 3 A 4 B 5 我需要一个SQL查询,它将返回每个玩家的三个最高分数,按玩家分组,按降序排列,即 Player Score A 5 A 4 A 3 B 5 B 4 B 3 非常感谢您的

假设我有一张这样的桌子:

Player  Score
A       5
B       4
A       3
B       2
A       1
B       1
A       2
B       3
A       4
B       5
我需要一个SQL查询,它将返回每个玩家的三个最高分数,按玩家分组,按降序排列,即

Player  Score
A       5
A       4
A       3
B       5
B       4
B       3

非常感谢您的指点。

根据您使用的数据库管理系统,您可能能够以某种形式使用行号

在SQLServer2008中,您可以使用

create table #player
( Player char, Score int )

insert into #player (Player, Score) Values
('A',5),('B',4),('A',3),('B',2),('A',1),('B',1),('A',2),('B',3),('A',4),('B',5)

select * from #player

select Player, Score from 
(
  select *, ROW_NUMBER() over(partition by Player order by Score desc) as rowNo 
  from #player
) as tmp
where tmp.rowNo <= 3

drop table #player

我想你要找的东西可以在这里找到:

基本上,最佳解决方案使用秩函数。以下是该站点的示例代码:

SELECT maker, model, type FROM
(
SELECT maker, model, type, RANK() OVER(PARTITION BY type ORDER BY model) num
FROM Product
) X
WHERE num <= 3
您只需按节修改分区,按分数降序排列即可

编辑

根据您将要使用MySQL的信息,您将需要对上面使用Microsoft SQL的查询进行一些修改。您需要用自己的RANK实现替换RANK函数。没那么难。完整的说明可在此处找到:


这将向您展示如何实现一个计数器,该计数器可以为您提供一个排名编号。

这是一种老式的read:basic sql方法,用于为每个组生成top-n。你可以在小组条件下加入表格,这里是玩家,在右边选择得分较高的记录;如果有三个或更少这样的记录,则该行是每组前n行中的一行

select player.player, player.score
from Player
left join Player p2
on p2.player = player.player
  and p2.score > player.score
group by player.player, player.score
having count(distinct p2.score) < 3
order by 1, 2 desc
这两个版本在关系的表示方式上有所不同——第一个版本根据group by的性质返回一行,并且需要连接回原始表以显示所有记录,第二个版本直接从原始表工作,同时显示所有数据和关系

您可以在SQL server中找到。

select p.player, p.score
from PS p
where p.score in (select top 3 score from PS 
                 where player = p.player order by score desc)
order by p.player asc, p.score desc
在MySql中:

select p.player, p.score
    from PS p
    where p.score in (select score from PS 
                     where player = p.player order by score desc limit 3)
    order by p.player asc, p.score desc

你能花点时间写下你的问题吗?它至少应该包含一个清晰的描述。您使用的是什么RDBMS和版本?我现在使用的是OpenOffice.org Base 3.3,但最终将在mySQL 5上实现它。谢谢,确实非常有用。
select p.player, p.score
    from PS p
    where p.score in (select score from PS 
                     where player = p.player order by score desc limit 3)
    order by p.player asc, p.score desc