2013-05-12 33 views
0

我想返回排名前五位的投票數最多的項目,按投票計數排序。 我想最好的辦法是將每行的votes_upvotes_down相加,然後取其中的前5個並與另一個表加入。SQL SUM前5個值然後加入結果

這裏是我現有的表,Items.ID映射到Votes.item_ID:

Items 
+----+--------+---------+ 
| ID | name | site_ID | 
+----+--------+---------+ 
| 10 | box |  111 | 
| 11 | hammer |  222 | 
| 12 | drill |  333 | 
| 13 | nail |  444 | 
+----+--------+---------+ 

Votes 
+----+---------+----------+------------+ 
| ID | item_ID | votes_up | votes_down | 
+----+---------+----------+------------+ 
| 1 |  10 |  25 |   20 | 
| 2 |  11 |  200 |  100 | 
| 3 |  12 |  100 |   50 | 
| 4 |  13 |  50 |   20 | 
+----+---------+----------+------------+ 

這些都是結果,我想回去:

+--------+-------+ 
| name | votes | 
+--------+-------+ 
| hammer | 100 | 
| drill | 50 | 
| nail | 30 | 
| box |  5 | 
+--------+-------+ 
+0

你試過做什麼?問題在哪裏? – Fabio 2013-05-12 22:06:55

+0

查看本維基百科頁面,其中顯示了各種數據庫的行數限制SQL語法:http://en.wikipedia.org/wiki/Select_(SQL)#Result_limits – BellevueBob 2013-05-12 23:33:00

回答

1
SELECT Items.name, votes_up-votes_down AS votes_num 
FROM  Items, Votes 
WHERE Items.id = Votes.item_id 
ORDER BY votes_num DESC 
LIMIT 5; 

數據庫第一做JOIN然後LIMIT,否則很可能會丟失元組。如果您使用的是MySQL或PostgreSQL,您可以使用EXPLAIN SELECT ...語句來驗證這一點。如果你想要做的前5個首先,你必須手工進行:

SELECT I.name, V.votes_num AS votes_num 
FROM Items I, 
    (SELECT item_ID, votes_up-votes_down AS votes_num 
    FROM Votes ORDER BY votes_num DESC LIMIT 5) V 
WHERE I.ID = V.item_ID 
ORDER BY votes_num DESC; 

結帳這個demo;它會返回你想要的結果。

NAME VOTES_NUM 
hammer 100 
drill 50 
nail 30 
box  5 
+0

謝謝,極限5部分如何? – 2013-05-12 22:06:33

+0

@RyanKoehler如果您使用MySql或postgresql,您可以使用LIMIT 5.請參閱我更新的帖子。 – Yang 2013-05-12 22:08:06

+0

這樣做是否先加入所有行然後限制,或找到前5個然後加入? – 2013-05-12 22:28:31

1
SELECT i.name AS name, v.votes_up-v.votes_down AS votes 
FROM items AS i 
JOIN votes AS v ON v.item_id=i.id 
ORDER BY votes DESC 
LIMIT 5 ; 

我覺得SELECT TOP 5是MS SQL語法。

+0

你可以在'order by'子句中使用別名,例如'ORDER BY votes DESC' – 2013-05-12 22:13:02

+0

我沒有意識到你可以做到這一點。這將使_ad hoc_查詢更容易。謝謝。 – nurdglaw 2013-05-13 08:40:47