2013-07-29 56 views
5

我想弄清楚什麼是實現這一目標的最佳方式,我非常感謝任何輸入。我的MySQL表推薦朋友積分查詢

部分:

ID , Username , Invited_by 
1 , A  , 
2 , B  , 1 
3 , C  , 2 
4 , D  , 2 
5 , E  , 4 
6 , F  , 5 

所以我想弄清楚是誰邀請的大多數用戶來說,招的是,如果A邀請B和B邀請C,那麼我會認爲這是一種邀請2 ,我想要達到的是這個。

ID , Username , Invited 
1 , A  , 5 
2 , B  , 4 
3 , C  , 0 
4 , D  , 2 
5 , E  , 1 
6 , F  , 0 

說明

  • ˚F邀請任何人,同樣對C
  • Ë邀請C以便他拿到1分
  • d邀請Ë所以這意味着後Ë註冊,他邀請˚F所以D得到2分
  • B邀請C和D,然後邀請D 2人B得4分
  • 邀請B他邀請4所以A得到5人

我知道這很複雜,這就是爲什麼我試圖找出最佳的解決方案。

感謝,

UPDATE

所以之後我嘗試了不同的方法,我相信我想出的最好的辦法是:

  • 添加1場給用戶表爲'total_invites'爲例
  • 建立一個查詢,它將計算每個用戶的邀請數,從最新的用戶開始,直到老因爲新用戶可能沒有機會邀請任何人。
  • 運行「每一次的cronjob或有限行」
  • 一旦我達到一個均衡表的邏輯會發生變化,而不是計算的結果對數據庫的查詢,一旦我需要的報告,我會增加每個帳戶的計數器以及相關的賬戶,每當一個新的稱爲用戶登錄。

注意

  • 即使建立單個用戶的查詢看起來很複雜,我想我必須做N次查詢,直到我到達底部Ø f該用戶的邀請樹
  • 我想一旦表達到平衡狀態,邏輯將變得更容易。

請如果您有任何想法或參考,可能會幫助我會非常感激。

+0

唯一的辦法是通過存儲過程或在您的應用程序運行幾個查詢(取決於最大「朋友深度」)。 – Vatev

+0

如果F邀請G,E也得到一個點? G邀請H,E得到另一個點? – Zelldon

+0

這是一個關於MySQL中遞歸的問題。因此,這是一個常見問題。 – Strawberry

回答

2

我不知道這是你在尋找什麼,但它會很長時間與許多左連接。

select t1.ID , t1.Username , count(t2.ID) + count(t3.ID) + count(t4.ID) as Invited 
from table1 t1 
left join table1 t2 On t1.ID = t2.Invited_by 
left join table1 t3 On t2.ID = t3.Invited_by 
left join table1 t4 On t3.ID = t4.Invited_by 
group by t1.ID 

DEMO HERE

輸出:

ID  USERNAME INVITED 
    1  A   5 
    2  B   4 
    3  C   0 
    4  D   2 
    5  E   1 
    6  F   0 

,如果你關心深深的好友列表,然後檢查該功能操作步驟可以循環扔。 get a recursive parent list

EDIT2:

一個良好aproche什麼即時通訊思想,它取決於你,當然如果你想做到這一點。

是不是插入先前邀請的人的Id,你可以連接所有以前邀請的人。像那樣

(1, 'A', NULL), 
    (2, 'B', 'A'), 
    (3, 'C', 'A,B'), 
    (4, 'D', 'A,B'), 
    (5, 'E', 'A,B,D'), 
    (6, 'F', 'A,B,D,E') 

每當你插入一個被邀請的人時,用concat以前的值與新的被邀請的人一起做。你已經打了他們。你不需要使用很多查詢,只需要一個。

看看this DEMO

+0

如果有另一個級別的邀請(說用戶F邀請G),那麼你需要添加另一個'JOIN'和另一個「計數」? –

+0

@echo_Me謝謝你的回答,我猜它會幫助我,請你檢查一下我的更新,讓我知道你的想法。 – trrrrrrm

+0

@CarlosCampderrós真的,謝謝,但我想如果我按照更新的方法,這可能會幫助 – trrrrrrm