在另一个查询中使用一个查询的结果

时间:2012-07-31 14:09:15

标签: mysql join subquery nested-sets

我们使用嵌套集模型的混合来允许孩子拥有多个父母。它是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

具体来说,我现在知道#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范围内的部分#125的lft和rgt值之间。如果我有两个表要比较,或者可以使用虚拟表,这很容易,但如果没有循环,这似乎不可能。

任何帮助感激不尽,但请欣赏我是愚蠢而不是懒惰,虽然我已经阅读了很多关于UNIONS,JOINS,HAVING,WHERE,SELECT(SELECT),以及数据的复杂性,我发现这个非常困惑。

亲切的问候,

詹姆斯

1 个答案:

答案 0 :(得分:1)

虽然我建议您重新访问数据架构,但我会尝试帮助您解决此问题。

首先,让我们重新审视JOIN。您的查询

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 值不在 lft rgt 之间的记录部分#125中的值,您必须使用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