的順序我有持有AA用戶ID,他們投票支持這樣的用戶表:選擇行的總數
uid | voted_for
1 | 3
2 | 3
3 | 1
是我的目標做的是基於有多少人爲了UID已經投票支持該uid。但我不知道該怎麼做。
所以,最終的結果將是:
uid | Total_Votes
3 | 2
1 | 1
2 | 0
希望你能幫助解釋來構造SQL這樣做的最佳方式。
的順序我有持有AA用戶ID,他們投票支持這樣的用戶表:選擇行的總數
uid | voted_for
1 | 3
2 | 3
3 | 1
是我的目標做的是基於有多少人爲了UID已經投票支持該uid。但我不知道該怎麼做。
所以,最終的結果將是:
uid | Total_Votes
3 | 2
1 | 1
2 | 0
希望你能幫助解釋來構造SQL這樣做的最佳方式。
這個簡單的查詢將產生你所要求的輸出:
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
嗯看到我試過你的第一個方法,並只有用戶有1票或更多的選票。我被1,2,3,4,5組的一個小混淆 - 之前沒有見過 - 你能解釋一下嗎? – Sir
您必須提及'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
啊所以偶數字段在我的'select'中沒有使用仍然被包括在'羣'by - 羞愧沒有簡單的'ALL'來表示xD – Sir
也許像這樣將有助於自身加入表:
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
可以有不止一個與同一個uid排 - 即myiple爲給定的uid投票值? – Bohemian
一個用戶只能投票給一個人。所以'uid'是唯一的。 – Sir
那麼total_votes和votes_for有什麼不同?您的表格中是否有另一列沒有顯示給我們,例如uid_voted_for? – Bohemian