我的数据库中有一个表,我使用混合嵌套集 (MPTT) 模型(具有lft
和rght
值的模型)和邻接列表模型(存储parent_id
在每个节点上)存储树结构。
my_table (id, parent_id, lft, rght, alias)
这个问题与树的任何 MPTT 方面都没有关系,但我想我会留下它,以防万一有人知道如何利用它。
我想将别名路径转换为特定节点。例如:"users.admins.nickf"
将找到别名为“nickf”的节点,该节点是别名为“admins”的节点的子节点,别名“admins”是位于根目录的“users”的子节点。上有一个唯一索引(parent_id, alias)
。
我从编写函数开始,以便将路径拆分为各个部分,然后一一查询数据库:
SELECT `id` FROM `my_table` WHERE `parent_id` IS NULL AND `alias` = 'users';-- 1
SELECT `id` FROM `my_table` WHERE `parent_id` = 1 AND `alias` = 'admins'; -- 8
SELECT `id` FROM `my_table` WHERE `parent_id` = 8 AND `alias` = 'nickf'; -- 37
但后来我意识到我可以用一个查询来做到这一点,使用可变数量的嵌套:
SELECT `id` FROM `my_table` WHERE `parent_id` = (
SELECT `id` FROM `my_table` WHERE `parent_id` = (
SELECT `id` FROM `my_table`
WHERE `parent_id` IS NULL AND `alias` = 'users'
) AND `alias` = 'admins'
) AND `alias` = 'nickf';
由于子查询的数量取决于路径中的步骤数,我是否会遇到子查询过多的问题?(如果有这样的事情)
有没有更好/更智能的方法来执行这个查询?