2016-10-02 24 views
0
+-----+-------+-----+ 
| id | Name |Votes| 
+-----+-------+-----+ 
| 1 | Joe | 36 | 
| 2 | John | 34 | 
| 3 | Mark | 42 | 
| 4 | Ryan | 29 | 
| 5 | Jay | 36 | 
| 6 | Shawn | 39 | 
+-----+-------+-----+ 

对于这个例子,我想要的是检索前3个最高票数的行。但是,如果您注意到,则有两行具有相同的投票计数。所以这应该是结果:提取前N行,包括结果值MYSQL

+-----+-------+-----+ 
| id | Name |Votes| 
+-----+-------+-----+ 
| 3 | Mark | 42 | 
| 6 | Shawn | 39 | 
| 1 | Joe | 36 | 
| 5 | Jay | 36 | 
+-----+-------+-----+ 

如何实现这一目标?

+0

如果你们downvote我的问题,请说明原因,所以我就能原因如果需要改变某些东西我需要帮助,而不是downvotes。 – fmpsagara

+1

不是一个谁downvoted。只是一个建议:你可以尝试以下策略:(1)获得前三个分数,以及(2)将该结果返回到该表本身以检索具有这些分数的所有条目。 – Terry

+0

谢谢@Terry!好主意。没有想到这一点。我正在考虑使用LIMIT,这绝对不是解决方案。你可以将它作为答案发布,我一定会接受它。 – fmpsagara

回答

2

您必须执行INNER JOIN,使用表格自身。首先,你要选择的前3独特/不同的分数,而这可以通过使用来完成:

SELECT DISTINCT Votes FROM mytable ORDER BY Votes DESC LIMIT 3 

现在你已经获得前3名的分数,你想加入回原来的表:

SELECT t1.* FROM mytable AS t1 
INNER JOIN 
    (SELECT DISTINCT Votes FROM mytable ORDER BY Votes DESC LIMIT 3) AS topvotes 
ON 
    topvotes.Votes = t1.Votes 
ORDER BY t1.Votes DESC 

请参考该策略的简单示意图:

INNER JOIN strategy

对于此查询是有效的,你会想指数Votes列,以便子查询可以快速捞出不同的票;)

这里是证明了概念SQLfiddle:http://sqlfiddle.com/#!9/c78f0/10

+0

非常感谢@Terry!这么棒的帮助! – fmpsagara

1

可能不是最有效的,但我认为这应该工作:

SELECT * FROM scores WHERE score IN(SELECT score FROM scores ORDER BY score DESC LIMIT 3) 

虽然这可以产生大约在子查询中不支持限制的错误。

解决方法;

SELECT * FROM scores WHERE score IN(SELECT * FROM (SELECT score FROM scores ORDER BY score DESC LIMIT 3) AS t) 
+0

感谢您的帮助@Koen。 – fmpsagara