背景
我在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
答案 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,所以空间调整应该是最少的)。