2013-07-29 25 views
5

Tôi đang cố gắng tìm ra cách tốt nhất để đạt được điều này, tôi thực sự đánh giá cao bất kỳ đầu vào nào.Truy vấn điểm bạn bè được giới thiệu

Một phần của MYSQL Bảng của tôi:

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

Vì vậy, tôi muốn tìm ra người đã mời những người sử dụng nhất, phần Bí quyết là rằng nếu A B mời và B mời C sau đó tôi sẽ đếm Đó Một mời 2 , những gì tôi đang cố gắng đạt được là điều này.

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

Giải thích

  • F mời không ai, tương tự cho C
  • E mời F nên anh có được 1 điểm
  • D mời E nên nó có nghĩa là sau khi E đăng ký ông mời F để D nhận được 2 điểm
  • B mời C và D, D rồi mời 2 người để B nhận được 4 điểm
  • Một người được mời B mà anh ta mời 4 để A có được 5 người

Tôi biết nó phức tạp, đó là lý do tại sao tôi đang cố gắng tìm ra giải pháp tối ưu cho nó.

Cảm ơn,

CẬP NHẬT

Vì vậy, sau khi tôi đã cố gắng tiếp cận khác nhau, tôi tin rằng phương pháp tốt nhất mà tôi đã đưa ra như sau:

  • Thêm 1 lĩnh vực cho người sử dụng bảng dưới dạng 'total_invites' ví dụ:
  • tạo truy vấn sẽ tính số lượng lời mời cho từng người dùng, bắt đầu từ người dùng mới nhất đến cũ người dùng vì người dùng mới có thể chưa có cơ hội mời bất kỳ ai.
  • chạy truy vấn trên cơ sở dữ liệu "cronjob hoặc trên các hàng bị giới hạn mỗi lần"
  • khi tôi đạt đến bảng cân bằng logic sẽ thay đổi thay vì tính kết quả khi tôi cần báo cáo tôi sẽ tăng bộ đếm cho mỗi tài khoản và các tài khoản có liên quan bất cứ khi nào một dấu hiệu sử dụng gọi mới trong.

GHI CHÚ

  • Ngay cả việc xây dựng một truy vấn cho một người dùng duy nhất có vẻ phức tạp và tôi nghĩ rằng tôi phải làm các truy vấn n cho đến khi tôi đạt đến đáy o f cây mời cho người dùng đó
  • tôi đoán khi bảng đạt trạng thái cân bằng, logic sẽ trở nên dễ dàng hơn nhiều.

Vui lòng nếu bạn có bất kỳ suy nghĩ hoặc tham chiếu nào có thể giúp tôi rất biết ơn.

+0

Giải pháp duy nhất là để chạy một vài truy vấn (tùy thuộc vào 'sâu friend' max) thông qua proc lưu trữ hoặc trong ứng dụng của bạn. – Vatev

+0

nếu F mời G, E cũng là một điểm? và G mời H, ​​E được một điểm khác? – Zelldon

+0

Đây là một vấn đề về đệ quy trong MySQL. Như vậy, đó là một câu hỏi thường gặp. – Strawberry

Trả lời

2

Tôi không biết nếu điều này bạn đang tìm kiếm nhưng nó sẽ có chút dài với nhiều lần gia nhập trái.

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

Output:

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

nếu bạn quan tâm đến sâu danh sách bạn bè sau đó kiểm tra thủ tục chức năng này để lặp ném chúng. get a recursive parent list

EDIT2:

một aproche tốt cho những gì suy nghĩ im, nó tùy thuộc vào bạn tất nhiên nếu bạn muốn làm điều đó.

thay vì chèn Id của người được bạn mời trước đó, bạn có thể Ghép tất cả những Người được mời trước đó. Giống như vậy

(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') 

mỗi lần bạn chèn người được mời làm điều đó với các giá trị trước đó trùng lặp với người mới được mời. bạn đã lặp lại chúng. và bạn không cần phải sử dụng nhiều truy vấn, chỉ một.

hãy nhìn vào this DEMO

+0

nếu có một mức độ mời (nói người dùng F mời G), sau đó bạn sẽ cần phải thêm một 'JOIN' và một 'số' khác? –

+0

@echo_Me Cảm ơn bạn đã trả lời, tôi đoán nó sẽ giúp tôi, bạn có thể vui lòng kiểm tra cập nhật của tôi và cho tôi biết suy nghĩ của bạn. – trrrrrrm

+0

@ CarlosCampderrós đúng, cảm ơn nhưng tôi đoán nếu tôi theo cách tiếp cận cập nhật này có thể giúp – trrrrrrm

Các vấn đề liên quan