2016-10-02 37 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