2010-08-12 85 views
3

我有一张表格,我想从中获得前N个记录。记录按值排序,一些记录具有相同的值。我想在这里做的是获得最佳N记录的列表,包括并列记录。这是在表中有什么:MySQL的T-SQL WITH TIES的替代方案

+-------+--------+ 
| Name | Value | 
+-------+--------+ 
| A  | 10  | 
| B  | 30  | 
| C  | 40  | 
| D  | 40  | 
| E  | 20  | 
| F  | 50  | 
+-------+--------+ 

现在,如果我想获得前3名,像这样

SELECT * FROM table ORDER BY Value DESC LIMIT 3 

我得到这个:

+-------+--------+ 
| Name | Value | 
+-------+--------+ 
| F  | 50  | 
| C  | 40  | 
| D  | 40  | 
+-------+--------+ 

我想获得的这

+-------+--------+ 
| Name | Value | 
+-------+--------+ 
| F  | 50  | 
| C  | 40  | 
| D  | 40  | 
| B  | 30  | 
+-------+--------+ 

我计算的排名所以我真正喜欢的是获得前N个排名记录,而不是按价值排序的前N个记录。这是我如何计算排名:

SELECT Value AS Val, (SELECT COUNT(DISTINCT(Value))+1 FROM table WHERE Value > Val) as Rank 

在T-SQL这样的事情是这样实现的:

SELECT TOP 3 FROM table ORDER BY Value WITH TIES 

有没有人有一个想法如何做到这一点在MySQL?我知道这可以通过子查询或临时表来完成,但我没有足够的知识来完成。我更喜欢不使用临时表的解决方案。

+0

为了您的信息,'WITH TIES'不会做你所描述的(并且想要)。它只包含上次剪切中的关系,不会返回所有不同的(X)值。 – 2013-06-13 19:23:06

回答

5

这是否适合您?

select Name, Value from table where Value in (
    select distinct Value from table order by Value desc limit 3 
) order by Value desc 

或许:

select a.Name, a.Value 
from table a 
join (select distinct Value from table order by Value desc limit 3) b 
    on a.Value = b.Value 
+1

不,我得到这个: #1235 - 这个版本的MySQL还不支持'LIMIT&IN/ALL/ANY/SOME子查询' – brozo 2010-08-12 15:11:44

+0

我正在使用MySQL 5.1.28-rc – brozo 2010-08-12 15:18:41

+0

我添加了另一个可能的变化..给那一枪。 – Fosco 2010-08-12 16:45:52

3
select a.Name, a.Value 
from table a 
join (select Value from table order by Value desc limit 3) b 
    on a.Value = b.Value 

这就好比@ Fosco的答案,但没有在子查询DISTINCT。他的版本会返回前N名球员,而不是前N名球员(加关系)。例如。如果得分是50,50,50,40,40,30,20,他会返回6名球员(3×50,2×40,1×30),但你大概只想要3×50。

+0

这个答案与SQL-Server的WITH TIES相同(但它似乎是OP不想要的。) – 2013-06-13 19:24:39

+0

嗯,没错。我没有注意到他在他的样本中包含的领带是在第二名。这是一件很奇怪的事情(这就是为什么'WITH TIES'的工作原理)。 – Barmar 2013-06-13 20:02:09

+1

维基百科称其为**密集排名**:** [排名](http://en.wikipedia.org/wiki/Ranking)** – 2013-06-13 20:10:00