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对不起,我忘了日期。如果您告诉我日期的列类型,我将更新我的答案。@Alp。。。。我在使用表设置上犯了一个小错误-非常抱歉-只有在我尝试运行您的查询时才发现它。。。希望您能更新您的查询以帮助我?现在,我无法提供快速解决方案。在更新的答案中看到我的第一种方法。我会尝试一下,看看它有多快。。。我有一些测试数据可以使用。。。感谢您的帮助@Alp