2017-05-01 40 views
0

因此,我目前在我的數據庫中有一個名爲'users'的表。PHP/MySQL根據推薦計數和選擇一條記錄排名用戶

可以說'用戶'有兩列:'Email'和'ReferralCount'。

例子:

Email  ReferralCount 
[email protected] 5 
[email protected] 3 
[email protected] 7 

我希望能夠做的,是排在該表中的數據,根據他們的推薦次數,從而使最高轉診數爲1級等等。然後我需要能夠根據他們的電子郵件地址獲得該用戶的排名。

我只使用基本的SQL,所以我不知道如何做到這一點?

任何幫助非常感謝!

+0

寫SELECT查詢和按降序排列的ReferralCount做訂單。 – manian

+0

您應該根據引用計數創建視圖,並在該視圖創建緩存中的存儲並從該處啓動查詢後,將該視圖置於那裏,如果用戶中有任何更新,則會再次創建新視圖。 – JiteshNK

+0

你想如何處理關係?說[email protected]也是5次參加......他們都是2人還是2人其中3人?他們都是3? – xQbert

回答

2

這取決於你的意思是「等級」。下面得到「密等級」,所以關係都具有相同的價值:

select 1 + count(distinct u.referralcount) 
from users u 
where u.referralcount > (select u2.referralcount from users u2 where u2.user = @email); 
+0

對不起,新的這個,但想知道是不是很好有子查詢在任何查詢? @Gordon Linoff – JiteshNK

+1

子查詢可以很好地使用,並且通常是構建特定查詢的唯一方法。 '加入users表的兩個實例將是解決這個問題的另一種方式,但子查詢就好了。 – RToyo

0

編輯:道歉,戈登·利諾夫已經更直接地回答了這個問題。這就是我在回答時被分心的一半所得到的。 :)


你可以使用子查詢抓住有問題的電子郵件中ReferralCount,然後得到的計數許多用戶怎麼行有較高的推薦計數。

你的子查詢將得到用戶的引用計數(例如,對於[email protected]爲「5」): select ReferralCount from users where [email protected]

然後如果你在where子句中使用它作爲子查詢,你可以計算有多少用戶具有更高的ReferralCount(記得給rank添加1,如果返回「1」更高的用戶,那麼你應該輸出「 2「作爲當前用戶的等級):

select 
    (count(*) + 1) as Rank 
from 
    users 
where 
    ReferralCount > (select ReferralCount from users where [email protected]) 

這將輸出」2「,因爲只有[email protected][email protected]有更多的引薦。

您可能希望跳過具有相同ReferralCount的用戶。例如,如果三個用戶都有「10」推介,並且您查詢的用戶有「9」,那麼上述查詢會輸出一個「4」的排名,即使9個推介僅次於10排在第二位。如果您寧願它返回的「2」(第二位)的等級,那麼你就可以得到ReferralCount的重複計數:

select 
    (count(distinct ReferralCount) + 1) as Rank 
from 
    users 
where 
    ReferralCount > (select ReferralCount from users where [email protected]) 
+0

你沒有提供每列的排名 - 另一個stackoverflow條目真的提供它:http://stackoverflow.com/questions/2520357/mysql-get-row-number-on-select - 檢查出來,如果你同意,你可以編輯你的答案? –

+0

@DavidSvarrer謝謝你指出我的答案。但是,我沒有看到這個問題與OP的問題有直接聯繫。也許你可以詳細闡述一點?我的理解是,OP的問題是詢問單個行所屬的級別,而您的鏈接問題只是想要爲多個返回的行生成行號。基本上OP是要求在整個表格內的行的排名,而該問題要求結果集中的行的排名。也許我忽略了一些東西? – RToyo

+1

@RobbieToyota正確我在一張桌子裏要求排名。 – fldchris