Storing Hierarchical Data (MySQL) for Referral Marketing

后端 未结 4 830
长发绾君心
长发绾君心 2021-01-12 23:20

I need to have a 5 levels hierarchy for the users registered to a website. Every user is invited by another, and I need to know all descendants for a user. And also ancestor

4条回答
  •  一向
    一向 (楼主)
    2021-01-13 00:03

    Closure Table

    ancestor_id  descendant_id  distance
        1            1              0
        2            2              0
        3            3              0
        4            4              0
        5            5              0
        6            6              0
        2            3              1
    

    To add user 10, referred by user 3. (I don't think you need to lock the table between these two insertions):

    insert into ancestor_table
    select ancestor_id, 10, distance+1
    from ancestor_table
    where descendant_id=3;
    
    insert into ancestor_table values (10,10,0);
    

    To find all users referred by user 3.

    select descendant_id from ancestor_table where ancestor_id=3;
    

    To count those users by depth:

    select distance, count(*) from ancestor_table where ancestor_id=3 group by distance;
    

    To find the ancestors of user 10.

    select ancestor_id, distance from ancestor_table where descendant_id=10;
    

    The drawback to this method is amount of storage space this table will take.

提交回复
热议问题