2013-04-16 61 views
2

好的,她是我的問題。我有3列的表:C1,C2,C3在MYSQL中,我們可以使用普通SELECT SQL而不是使用存儲過程來執行循環嗎?

 
C1 - C2 - C3 
M - is - M1 
N2 - is - N3 
M2 - is - M3 
M3 - is - M4 
N1 - is - N2 
M1 - is - M2 
N - is - N1 

因此,當用戶搜索 「M1」,系統會顯示:

 
M1 
M2 
M3 
M4 

,當用戶搜索 「M3」系統會顯示:

 
M3 
M4 

當 「N」 用戶搜索,系統會顯示:

 
N 
N1 
N2 
N3 

顯然,這種查詢需要某種循環,即在「is」之後搜索任何單詞,然後在該單詞之後繼續搜索單詞。

我想在MySQL中使用普通的「選擇SQL」而不是使用存儲過程來完成這項任務。但我不知道該怎麼做。

我們是否必須使用「WITH」關鍵字?

如何在不使用存儲過程的情況下執行上述查詢?

+0

搜索的術語是「傳遞閉包」。請參閱http://en.wikipedia.org/wiki/Recursive_closure#In_database_query_languages –

回答

2

所以,粘在不使用存儲過程的要求,下面的查詢可以使用:

SELECT t1.C1 AS Value1, t2.C1 AS Value2, t3.C1 AS Value3, t4.C1 AS Value4 
FROM your_table t1 
LEFT JOIN your_table t2 ON t1.C3=t2.C1 
LEFT JOIN your_table t3 ON t2.C3=t3.C1 
LEFT JOIN your_table t4 ON t3.C3=t4.C1 

它會返回結果如M1 M2 M3 M4。如果您需要在「循環」更多,你可以另外LEFT JOIN添加到查詢:

SELECT t1.C1 AS Value1, t2.C1 AS Value2, t3.C1 AS Value3, t4.C1 AS Value4, t5.C1 AS Value5 
FROM your_table t1 
LEFT JOIN your_table t2 ON t1.C3=t2.C1 
LEFT JOIN your_table t3 ON t2.C3=t3.C1 
LEFT JOIN your_table t4 ON t3.C3=t4.C1 
LEFT JOIN your_table t5 ON t4.C3=t5.C1 

You will however be limited in the number of tables you can join this way

,可以在一個單一的被引用的表的最大數目加入 爲61。

您將需要使用服務器端語言(PHP?)來檢查Value2,Value3 ... ValueN是否爲空。

我的建議是使用存儲過程,或者更改表模式以避免必須以這種方式在表中循環。

+0

Thax you Jocelyn非常。 – Tom

0

可能使用遞歸CTE完成此任務;不幸的是,MySQL還不支持這些。

但是,我向您承諾,您在實施稱爲「樸素樹」的經典SQL反模式中存在更大的問題;我強烈建議您查看幻燈片SQL Anti-Patterns Strike Back--特別是以幻燈片48開頭的部分,作者將提供可行的備選方案,使您的問題更易於封裝在數據庫支持的SQL子集中。

相關問題