2013-05-28 53 views
3

的順序我有持有AA用戶ID,他們投票支持這樣的用戶表:選擇行的總數

uid | voted_for 
1 | 3 
2 | 3 
3 | 1 

是我的目標做的是基於有多少人爲了UID已經投票支持該uid。但我不知道該怎麼做。

所以,最終的結果將是:

uid | Total_Votes 
3 |  2 
1 |  1 
2 |  0 

希望你能幫助解釋來構造SQL這樣做的最佳方式。

+0

可以有不止一個與同一個uid排 - 即myiple爲給定的uid投票值? – Bohemian

+0

一個用戶只能投票給一個人。所以'uid'是唯一的。 – Sir

+0

那麼total_votes和votes_for有什麼不同?您的表格中是否有另一列沒有顯示給我們,例如uid_voted_for? – Bohemian

回答

1

這個簡單的查詢將產生你所要求的輸出:

select voted_for as uid, count(*) as total_votes 
from users 
group by 1 
order by 2 desc 

如果您想了解在輸出的每個用戶的所有數據,用戶加入到本身:

select u.*, count(v.uid) as total_votes 
from users u 
left join users v on v.voted_for = u.uid 
group by 1,2,3,4,5 -- put as many numbers here as there are columns in the users table 
order by total_votes desc 

這第二個查詢會給total_votes零分,如果沒有人投給了用戶。

或者,您也可以只選擇那些列你想:

select u.uid, u.name, count(v.uid) as total_votes 
from users u 
left join users v on v.voted_for = u.uid 
group by 1,2 
order by 3 desc 

```

只返回贏家,這樣做:

select u.uid, u.name, count(*) as total_votes 
from users u 
left join users v on v.voted_for = u.uid 
group by 1,2 
having count(*) = (
    select max(c) from (
     select count(*) as c from users group by voted_for)) 
order by 3 desc 
+0

嗯看到我試過你的第一個方法,並只有用戶有1票或更多的選票。我被1,2,3,4,5組的一個小混淆 - 之前沒有見過 - 你能解釋一下嗎? – Sir

+0

您必須提及'group by'子句中的所有非聚合列。您可以通過名稱/表達式*或*按列位置引用它們。假設用戶表(未顯示)具有這些列:'uid,name,joined_date,age,voted_for'那麼'group by 1,2,3,4,5'等同於'group by uid,name,joined_date,age ,voteed_for'。按你想要的方式對團隊進行編碼,只要確定你選擇了'u。*'你在group by子句中提及'users'中的所有*列(或者查詢將無法正常工作,即使它也不會出錯) – Bohemian

+0

啊所以偶數字段在我的'select'中沒有使用仍然被包括在'羣'by - 羞愧沒有簡單的'ALL'來表示xD – Sir

2

也許像這樣將有助於自身加入表:

SELECT u.*, voted_for_cnt 
FROM users u 
    LEFT JOIN (
     SELECT voted_for, count(1) voted_for_cnt 
     FROM users 
     GROUP BY voted_for 
    ) t ON u.uid = t.voted_for 
ORDER BY t.voted_for_cnt DESC 
+0

真棒謝謝你!並感謝您向我介紹SQL提琴:D – Sir

+0

@Dave - np,很高興我可以幫助! – sgeddes