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

问题描述:

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

我对SQL相当新,但我调查了连接,子查询等,似乎没有任何东西可以提供我需要的结果。我希望答案相当简单,但几乎肯定会是一个LEFT JOIN,但我不能把它放在手上。

我有一个简单的表,名为'nested_pa​​rts'有5列:'tree_id','part_id','lft','rgt'和'映射'。

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

SELECT * FROM nested_parts WHERE part_id = 125 

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

我现在需要知道所有part_id,它们是我之前拉出的tree_id结果数组。

我用这个这个子查询:

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

现在我需要知道哪些PART_ID的有不都是tree_id范围内的一部分#125 LFT和RGT值之间LFT和RGT值。如果我有两个表格可以比较,或者可以使用虚拟表格,这很容易,但是在没有循环的情况下这似乎不可行。

任何帮助感激地收到,但请明白,我是愚蠢的不懒惰,虽然我已经读了很多关于工会,联接,HAVING,WHERE,SELECT(SELECT),与顶部的数据的复杂性,我发现这非常混乱。

亲切的问候,

詹姆斯

+0

嗨詹姆斯,你可以设置sqlfiddle @:http://sqlfiddle.com/ – 2012-07-31 14:14:10

+0

这是一个很好的问题尽管在那里结尾有点混乱。 – Matt 2012-07-31 14:19:35

+0

我删除了PHP标签,因为虽然你正在PHP中实现它,但它本质上是一个mysql问题。 – Matt 2012-07-31 14:59:15

虽然我会建议重新访问您的数据架构,我会尽力帮助你解决这方面的问题。

首先,让我们重温JOIN s。您的查询

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 

被简化,我会更全面地后,我看完这个问题,并充分了解它回答了一下。我希望这有助于现在。

UPDATE:

为了得到只记录其中LFTRGT值不LFTRGT之间从部分#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 
+0

你是一个绅士和学者。非常感谢你的帮助。我曾尝试过类似的连接,但我不知道你可以一起使用np。*和AS,还可以在自连接的第二部分使用AND,这使得自连接实际上可用。我只是在最后颠倒了两者之间的值来改变逻辑,但你的答案是完美的。 SELECT NP。* FROM nested_pa​​rts成NP INNER JOIN nested_pa​​rts AS NP2 ON np.tree_id = np2.tree_id AND np2.part_id = 125 AND np.lft np2.rgt – 2012-07-31 14:39:14

+0

@JamesPitt圣洁的废话,工作?!我在黑暗中拍摄了一张照片! – Matt 2012-07-31 14:40:35

+0

@JamesPitt尽管你认真,但是你知道那里发生了什么吗? – Matt 2012-07-31 14:41:08