Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Armazenando dados hierárquicos (MySQL) para marketing de referência

Tabela de encerramento

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

Para adicionar o usuário 10, indicado pelo usuário 3. (Eu não acho você precisa bloquear a tabela entre essas duas inserções):
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);

Para encontrar todos os usuários indicados pelo usuário 3.
select descendant_id from ancestor_table where ancestor_id=3;

Para contar esses usuários por profundidade:
select distance, count(*) from ancestor_table where ancestor_id=3 group by distance;

Para encontrar os ancestrais do usuário 10.
select ancestor_id, distance from ancestor_table where descendant_id=10;

A desvantagem desse método é a quantidade de espaço de armazenamento que essa tabela ocupará.