我在我的数据库中有一个表,我使用混合嵌套集(MPTT)模型(具有 lft 和 rght 值的模型)和邻接列表模型(在每个节点上存储 parent_id )存储树结构 .
my_table (id, parent_id, lft, rght, alias)
如果有人对如何利用它有一个好主意,这个问题不会留下来 .
我想将别名路径转换为特定节点 . 例如: "users.admins.nickf" 将找到具有别名"nickf"的节点,该节点是具有别名"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';
由于子查询的数量取决于路径中的步骤数,我是否会遇到有太多子查询的问题? (如果有这样的事情)
有没有更好/更聪明的方法来执行此查询?