我们使用嵌套集模型的混合来允许孩子拥有多个父母。它是Mike Hillyers博客中描述的嵌套集模型的扩展:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ - 这可能有助于解释一些列名。
我对SQL很新,但我已经调查了连接,子查询等,似乎没有什么能给我提供我需要的结果。我希望答案相当简单,几乎绝对是LEFT JOIN
,但我不能指责它。
我有一个名为'nested_parts'的简单表,有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),以及数据的复杂性,我发现这个非常困惑。
亲切的问候,
詹姆斯
答案 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