2011-06-13 47 views
0

我有一個數據庫表,其中包含不同產品的類別。每個類別只有一個家長,每個產品可以有多個類別。我需要爲數據遷移構建一種麪包屑導航,但無法弄清楚如何映射數據,因此我沒有查詢的餘地。將多行中的數據轉移到單列

數據庫是建立像這樣:

id  category    sort  parent 
1  Home     0  0 
58  Car & Truck   4  1 
135 10' Wide Shelters  0  58 

現在我需要找回數據是這樣的:Home/Car & Truck/10' Wide Shelters

這是純粹的SQL可能嗎,還是我需要混合使用ColdFusion才能得到它。如果我可以用純SQL來做到這一點,那我該怎麼做,如果我不能,那麼ColdFusion會是什麼樣子?

+2

調查此問題 - http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database - 特別是MySQL會話變量 - 和GROUP_CONCAT ():http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat – orangepips 2011-06-14 01:34:20

+0

+1。非常徹底的線程。只是好奇 - 爲什麼「評論」與「答案」? – Leigh 2011-06-14 03:56:24

+0

@Leigh:如果可能的話,我喜歡我的答案來真正解決問題。在這種情況下,我想包括確切的SQL來實現它,但是由於我沒有在任何地方設置MySQL,我決定提供一個應該導致答案的指針。如果OP認爲它值得作爲答案,我會發布這樣的要點:)。 – orangepips 2011-06-14 13:36:47

回答

0

使用嵌套組的建議,user349433我能想出這個查詢

SELECT c1.id AS id1, c1.category AS name1, c2.id AS id2, c2.category AS name2, c3.id AS id3, c3.category AS name3, c4.id AS id4, c4.category AS name4, c5.id AS id5, c5.category AS name5 
FROM category c1 
LEFT JOIN category AS c2 ON c2.parentid = c1.id 
LEFT JOIN category AS c3 ON c3.parentid = c2.id 
LEFT JOIN category AS c4 ON c4.parentid = c3.id 
LEFT JOIN category AS c5 ON c5.parentid = c4.id 

我的數據從來沒有去深度超過5級(我用C6和獲取零點檢查驗證)。從這裏我可以查詢此

SELECT (name1 + '/' + name2 + '/' + name3 + '/' + name4 + '/' + name5) AS category 
FROM getCats 
WHERE 
    <cfloop query="Arguments.assignments"> 
     (id1 = #Arguments.assignments.categoryid# OR id2 = #Arguments.assignments.categoryid# OR id3 = #Arguments.assignments.categoryid# OR id4 = #Arguments.assignments.categoryid# OR id5 = #Arguments.assignments.categoryid#) 
     <cfif Arguments.assignments.currentrow IS NOT Arguments.assignments.recordCount> OR </cfif> 
    </cfloop> 

我已經有產品及其類別ID的查詢循環。

+0

回覆:*使用嵌套集* ...你的意思是你有另一個表使用嵌套集? (發佈的是鄰接模型) – Leigh 2011-06-15 00:41:24

+0

對不起,我誤讀了mysql文章。它不是嵌套集合,而只是連接。 – 2011-06-15 14:27:17

+0

好的。要記住未來,這仍然是一個很好的參考;)嵌套設置可以很好地適用於菜單。 – Leigh 2011-06-15 15:43:41

0

其他RDBMS支持各種解決此問題的方法(ANSI SQL中的遞歸with,Oracle中的connect by等)。但在MySQL中,你幾乎只剩下nested sets