【问题标题】:Pivoting Data in Multiple Rows to a Single Column将多行中的数据透视到单个列
【发布时间】:2011-06-13 14:52:39
【问题描述】:

我有一个数据库表,其中包含不同产品的类别。每个类别只有一个父类别,每个产品可以有多个类别。我需要为数据迁移构建一种面包屑导航,但不知道如何映射数据,这样我就没有大量的查询。

数据库是这样设置的:

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 会是什么样子?

【问题讨论】:

  • 调查这个问题 - stackoverflow.com/questions/4048151/… - 特别是 MySQL 会话变量 - 和 GROUP_CONCAT():dev.mysql.com/doc/refman/5.0/en/…
  • +1。非常彻底的线程。只是好奇 - 为什么是“评论”而不是“答案”?
  • @Leigh:如果可能的话,我喜欢我的答案来实际解决问题。在这种情况下,我想包含确切的 SQL 来实现它,但是由于我在任何地方都没有设置 MySQL,所以我决定提供一个指向答案的指针。如果 OP 认为它值得作为一个答案,我会这样发布以获得积分:)。
  • @orangepips - 明白了。我也倾向于这样做。但这是关于该主题的很棒 线程。 IMO,如果您在那里找不到答案……您只是没有注意;)

标签: mysql database coldfusion hierarchy


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    按照 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 进行了查询。

    【讨论】:

    • Re: 使用嵌套集...你的意思是你有另一个使用嵌套集的表吗? (贴的是邻接模型)
    • 对不起,我看错了mysql的文章。它不是嵌套集合,而只是连接。
    • 好的。它仍然是未来的一个很好的参考;)嵌套集可以很好地用于菜单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多