2012-07-31 160 views
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'和'映射'。

以下查詢返回我想要在第二個查詢中進行比較的值。

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

回答

1

雖然我會建議重新訪問您的數據架構,我會盡力幫助你解決這方面的問題。

首先,讓我們重溫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

相關問題