我正在使用 MySQL (5.7.20) 来存储文件夹层次结构。每个文件夹都与所有直接和间接父项一起存储,包括距离。例如,以下文件夹
A
+- B
+ C
+ D
会像这样存储:
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
此外,还有另一个表将文件夹链接到一个或多个用户,如下所示:
child | user
------+-----
A | U1
B | U1
C | U2
D | U2
我现在想要实现的是通过用户以仅返回层次结构中最高匹配的方式查询此层次结构。
因此,如上例所示,如果我查询用户的文件夹U1
,我只想要A
结果,因为第二个匹配B
项是A
. 另一方面,如果我查询 user 的文件夹U2
,结果应该是C, D
因为两个文件夹都在同一层次结构级别。
我能想到的最接近的查询是,SELECT child, dist AS d FROM folders JOIN users ON folders.child = users.child GROUP BY folders.parent HAVING d = min(d);
但不幸的是它没有给出正确的结果,例如,对用户的查询U1
仍然会给出文件夹A,B
。
有谁知道如何做到这一点?
我想你想要这个。表中的所有结果,
users
除了那些在用户中有父级的结果: