2011-06-13 44 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