Estou usando o MySQL (5.7.20) para armazenar uma hierarquia de pastas. Cada pasta é armazenada junto com todos os pais diretos e indiretos incluindo a distância. Como exemplo, as seguintes pastas
A
+- B
+ C
+ D
seria armazenado assim:
parent | child | dist
-------+-------+-----
A | A | 0
A | B | 1
A | C | 2
A | D | 2
B | B | 0
B | C | 1
B | D | 1
C | C | 0
D | D | 0
Além disso, há outra tabela que vincula uma pasta a um ou vários usuários, como esta:
child | user
------+-----
A | U1
B | U1
C | U2
D | U2
O que estou tentando fazer agora é consultar essa hierarquia por usuário de forma que apenas as correspondências mais altas na hierarquia sejam retornadas.
Então, como no exemplo acima, se eu consultar as pastas de user U1
, eu só quero A
como resultado, porque a segunda correspondência B
é um filho de A
. Por outro lado, se eu consultar as pastas de user U2
, o resultado deve ser C, D
que ambas as pastas estejam no mesmo nível de hierarquia.
A consulta mais próxima que eu poderia imaginar foi SELECT child, dist AS d FROM folders JOIN users ON folders.child = users.child GROUP BY folders.parent HAVING d = min(d);
, mas infelizmente não está dando os resultados corretos, pois, por exemplo, uma consulta para o usuário U1
ainda daria pastas A,B
como resultado.
Alguém tem ideia de como isso pode ser feito?
Acho que você quer isso. Todos os resultados da
users
tabela, exceto aqueles que têm um pai em users: