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?