1

我们正在使用嵌套集模型的混合体来允许一个孩子有多个父母。它是 Mike Hillyers 博客中描述的嵌套集模型的扩展:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ -这可能有助于解释一些列名。

我对 SQL 还很陌生,但我研究了连接、子查询等,但似乎没有什么能提供我需要的结果。我希望答案相当简单,而且几乎肯定会是一个LEFT JOIN,但我不能指望它。

我有一个名为“nested_pa​​rts”的简单表,有 5 列:“tree_id”、“part_id”、“lft”、“rgt”和“mapping”。

以下查询返回我要在第二个查询中比较的值。

SELECT * FROM nested_parts WHERE part_id = 125

具体来说,我现在知道part#125 存在于哪个tree_id 中,以及每个tree_id 的lft 和rgt 值。

我现在需要知道我之前提取的 tree_id 结果数组中的所有 part_id。

我为此使用了一个子查询:

SELECT * FROM nested_parts
WHERE tree_id = ANY (SELECT tree_id AS tbl FROM nested_parts WHERE part_id = 125)

现在我需要知道哪些part_id 的lft 和rgt 值不在每个tree_id 范围内part#125 的lft 和rgt 值之间。如果我仍然有两个表要比较,或者可以使用虚拟表,这将很容易,但如果没有循环,这似乎是不可能的。

任何帮助都非常感激,但请感谢我是愚蠢而不是懒惰,虽然我已经阅读了很多关于 UNIONS、JOINS、HAVING、WHERE、SELECT(SELECT) 的内容,但数据的复杂性是最重要的,但我发现这非常令人困惑。

亲切的问候,

詹姆士

4

1 回答 1

1

虽然我建议重新审视您的数据架构,但我会尽力帮助您解决这个特定问题。

首先,让我们重温一下JOINs。您的查询

SELECT * FROM nested_parts WHERE tree_id = ANY (SELECT tree_id AS tbl FROM nested_parts WHERE part_id = 125)

可以简化为JOIN

SELECT np.* FROM nested_parts AS np
INNER JOIN nested_parts AS np2
ON np.tree_id = np2.tree_id
AND np2.part_id = 125

在我读完问题并完全理解之后,我会更完整地回答。我希望这对现在有所帮助。

更新:

为了仅获取 lft 和 rgt 值不在第 125 部分中的lftrgt之间记录,您必须使用条件。HAVING

SELECT np.* FROM nested_parts AS np
INNER JOIN nested_parts AS np2
ON np.tree_id = np2.tree_id
AND np2.part_id = 125
HAVING np.lft > np2.rgt
    AND np.rgt < np2.lft

如果我的逻辑在这里不好,请告诉我。不过,我认为这就是您要寻找的东西。

编辑:

您的查询还可以组合连接条件

SELECT np.* FROM nested_parts AS np
INNER JOIN nested_parts AS np2
ON np.tree_id = np2.tree_id
AND np2.part_id = 125
AND np.lft > np2.rgt
AND np.rgt < np2.lft
于 2012-07-31T14:15:08.597 回答