【问题标题】:mysql "with rollup" query morphed into a tree structuremysql "with rollup" 查询变成了树形结构
【发布时间】:2009-05-29 01:24:15
【问题描述】:

背景:

我在 MySQL 中定义了这个“with rollup”查询:

    SELECT      
        case TRIM(company)
            when 'apple'        THEN 'AAPL'
            when 'microsoft'    THEN 'MSFT'
            else '__xx__'
        END as company        

        ,case TRIM(division)
            when 'hardware'         THEN Trim(division)
            when 'software'         THEN Trim(division)
            else '__xx__'
        END as division

        ,concat( '$' , format(sum(trydollar),0))    as  dollars
    FROM        pivtest
    GROUP BY    
        company, division with rollup        

它会生成这个输出:

AAPL;hardware;$279,296
AAPL;software;$293,620
AAPL;__xx__;$572,916
MSFT;hardware;$306,045
MSFT;software;$308,097
MSFT;__xx__;$614,142
__xx__;__xx__;$1,187,058

如果您之前在 MySQL 中使用过“with rollup”查询,您很可能可以推断出我的源表的结构。

问题:

鉴于 MySQL 的原始输出,获得如下“树”结构的最简单方法是什么?

AAPL
    hardware;$279,296
    software;$293,620
        Total; $572,916
MSFT
    hardware;$306,045
    software;$308,097
        Total;$614,142
Total    
            $1,187,058

【问题讨论】:

标签: php mysql tree hierarchy rollup


【解决方案1】:

最简单是在您用来接收和显示用户 MySQL 输出的任何客户端程序中执行此操作——绝对不是最容易实现表示层功能的数据层!-) 所以请告诉我们您的客户端程序中使用的是什么语言 &c,我们或许可以提供帮助...

编辑:应原始提问者的要求提供简单的 Python 客户端解决方案。

使用 Python 的 DB API,DB 查询的结果可以最简单地视为元组列表。所以这里有一个函数可以根据需要格式化这些结果:

def formout(results):
  marker = dict(__xx__='   Total')
  current_stock = None
  for stock, kind, cash in results:
    if stock != current_stock:
      print marker.get(stock, stock).strip()
      current_stock = stock
    if kind in marker and stock in marker:
      kind = ' '*8
    print '    %s;%s' % (marker.get(kind, kind), cash)

marker 是一个字典,用于将特殊标记 '__xx__' 映射到输出中所需的字符串(我为“中间”总计适当地填充它,所以当我打印最终的“总计”时,我.strip()那些空白)。我还使用它来检查前两列都是标记的特殊情况(因为在这种情况下,第二列需要改为空格)。如有必要,请随时在 cmets 中询问有关 Python 习语和使用的任何进一步说明!

这是我使用提供的数据调用此函数时看到的输出(变成一个包含 7 个元组的列表,每个元组有 3 个字符串):

AAPL
    hardware;$279,296
    software;$293,620
       Total;$572,916
MSFT
    hardware;$306,045
    software;$308,097
       Total;$614,142
Total
            ;$1,187,058

空间对齐方式与我在问题中看到的不同(就应该有多少空间而言,这有点不一致)但我希望它足够接近你想要让它变得容易您可以根据自己的确切需求对其进行调整(因为无论如何您都必须将 Python 翻译成 PHP,因此空间调整应该是最少的)。

【讨论】:

  • 是的,我绝对不打算在纯 SQL 中实现这一点。目前,我正在使用 PHP。
  • 好的,然后我正在编辑问题以将其标记为 php,因此 php 专家可以注意到它并提供帮助(我可以向您展示如何在 Python 中执行此操作,但这不会帮助不大;-)。
  • 肯定会有所帮助,它会从 python 的角度回答问题,并为某人提供如何解决问题的示例。将 python 翻译成 php 将是一个额外的步骤,但有些人不介意
  • 感谢 Alex,这是一个非常易读易懂的实现。 Python 中的示例与伪代码中的示例一样好(如果不是更好的话),所以这绝对有帮助!
猜你喜欢
  • 1970-01-01
  • 2021-04-04
  • 2016-01-06
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多