2009-05-29 84 views
0

背景:的mysql “与汇总” 查询演变成一个树状结构

我已经在MySQL中定义这个 “与汇总” 查询:

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 

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

问:

鉴于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 
+0

http://www.tagarga.com/blok/on/061029,要考虑的一个概念是邻接列表方法 – dreftymac 2009-05-29 19:17:08

回答

2

最简单是做以任何客户端程序你使用的接收和显示用户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) 

是特殊标记'__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,空间调整应该是最不重要的)。

+0

是的,我绝对不打算在纯SQL中实现这个。目前,我正在使用PHP。 – dreftymac 2009-05-29 16:17:59