Php 从表数输出发票
我有下列表格Php 从表数输出发票,php,mysql,sql,symfony1,Php,Mysql,Sql,Symfony1,我有下列表格 customers cust_id cust_name 1 a company 2 a company 2 3 a company 3 tariffs tariff_id cost_1 cost_2 cost_3 1 2 0 3 2 1 1 1 3 4
customers
cust_id cust_name
1 a company
2 a company 2
3 a company 3
tariffs
tariff_id cost_1 cost_2 cost_3
1 2 0 3
2 1 1 1
3 4 0 0
terminals
term_id cust_id term_number tariff_id
1 1 12345 1
2 1 67890 2
3 2 14324 1
4 3 78788 3
usage
term_ident usage_type usage_amount date
12345 1 20 11/12/2010
67890 2 10 31/12/2010
14324 1 1 01/01/2011
14324 2 5 01/01/2011
78788 1 0 14/01/2011
在现实生活中,表格相当大——有5000个客户、250个关税、500000个终端和500万个使用记录
在terminals表中,term_id、cust_id和tariff_id都是外键。用法表中没有外键-这只是从csv文件导入的原始数据
使用情况表中可能有端子不存在于端子表中-可以忽略这些端子
我需要做的是根据客户的使用情况开具发票。我只想包括2010年12月15日至2011年1月15日之间的使用情况-这是计费周期。我需要根据价格计算发票的行项目以供使用。。。例如:以使用表中的第一条记录为例-term_id 1的使用成本为90x2=180,这是因为term_id使用tariff_id编号1
输出应如下所示
Customer 2
date terminal usage_cost_1 usage_cost_2 usage_cost_3 total cost
01/01/2011 14324 18 0 6 24
我是一名称职的PHP开发人员,但只是SQL的初学者。我需要的是关于生成发票的最有效流程的一些建议——也许在PHP开始计算成本之前,有一个SQL查询可以帮助我——或者SQL语句也可以生成成本?欢迎任何建议
编辑:
1,当前运行这个过程的是它用C++编写的,大约需要24个小时来处理这个过程…我无法访问源代码
2我在Symfony中使用了条令-我不确定条令的帮助有多大,因为对象检索数据只会减慢过程-我不确定在这里使用对象是否会有太多帮助 编辑@13:54-> 使用率表指定不正确。。。对不起我必须将使用类型映射到每个终端的特定费率上的成本,即使用类型1=相应费率中的成本1。。。我想这会让事情稍微复杂一点?好了,应该不到24小时
SELECT u.date, u.term_ident terminal,
(ta.cost_1 * u.usage_1) usage_cost_1,
(ta.cost_2 * u.usage_2) usage_cost_2,
(ta.cost_3 * u.usage_3) usage_cost_3,
(usage_cost_1 + usage_cost_2 + usage_cost_3) total_cost
FROM usage u
INNER JOIN terminals te ON te.term_number = u.term_ident
INNER JOIN tariffs ta ON ta.tariff_id = te.tariff_id
INNER JOIN customers c ON c.cust_id = te.cust_id
WHERE u.date BETWEEN '2010-12-15' AND '2011-01-15'
AND c.cust_id = 2
此查询仅适用于客户id为2的客户。如果需要整个数据集的结果,只需删除该条件
使现代化
你的新需求并不是那么简单。您可以将使用情况表转换为以前发布的新表
要在SELECT查询中做出决策,可以执行以下操作。但这并不是你所期望的结果。它可以用来创建转换后的新用法表
SELECT u.date, u.term_ident terminal,
CASE u.usage_type
WHEN 1 then ta.cost_1 * u.usage_1
WHEN 2 then ta.cost_2 * u.usage_2
WHEN 3 THEN ta.cost_3 * u.usage_3
AS usage_cost
FROM usage u
INNER JOIN terminals te ON te.term_number = u.term_ident
INNER JOIN tariffs ta ON ta.tariff_id = te.tariff_id
INNER JOIN customers c ON c.cust_id = te.cust_id
WHERE u.date BETWEEN '2010-12-15' AND '2011-01-15'
AND c.cust_id = 2
我怎么知道术语_ident=12345使用关税_id=1?它是否使用从1到5的所有关税标识?这不应该在24小时内完成。@Alp。。很抱歉在我的问题中不是很清楚-term_ident=term_number在terminals表中-我给它们取了不同的名字,因为它们在MySQL中没有关系。@Nick。。。那正是我说的。。他们回答说。。。如果你能做得更快,就去做吧!!由于我的基本查询/更新和删除sql知识有限——我会运行大量sql查询来提取数据,然后在PHP中处理所有数据——但我相信有一种更有效的方法来获取所有数据?1/2的问题?谢谢…也许我的问题措辞不太好或解释得不够。。。我必须为每个客户开具发票。。。我想我会为每个客户发出上面的查询,显然更改了WHERE子句。。。日期将是一个附加的where条款。。。WHERE date