mysql“with rollup”查询变形为树形结构

时间:2009-05-29 01:24:15

标签: php mysql tree hierarchy rollup

背景

我在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

1 个答案:

答案 0 :(得分:2)

最简单是在您用于接收的任何客户端程序中执行此操作并向用户显示MySQL的输出 - 绝对最容易实现表示层功能数据层! - )请告诉我们您的客户端程序中的语言和c是什么,我们可能会帮助...

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

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

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()那些空白。我还用它来检查前两列都是标记的特殊情况(因为在这种情况下,第二列需要转换为空格)。请随意在评论中询问有关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,所以空间调整应该是最少的)。