将多行数据转换为单列

时间:2011-06-13 14:52:40

标签: mysql database coldfusion hierarchy

我有一个数据库表,其中包含不同产品的类别。每个类别只有一个父级,每个产品可以有多个类别。我需要为数据迁移构建一种面包屑导航,但是无法弄清楚如何映射数据以便我不需要查询。

数据库设置如下:

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 个答案:

答案 0 :(得分:0)

其他RDBMS支持解决此问题的各种方法(ANSI SQL中的递归with,Oracle中的connect by等)。但是在MySQL中,你只剩下nested sets

答案 1 :(得分: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>

我已经查询了产品及其类别标识以进行循环。