如何循环SQL查询结果? (以及关于SQL结果操作的一些其他问题。)

时间:2012-12-18 20:55:52

标签: mysql sql

我有一个相当简单的脚本:我必须为我的组织计算所有国际通话费用。我有两个表:phonelog表和费率表。

我已经解决的解决方案很简单:

从电话日志表中选择目的地国家/地区代码和通话时长

从费率表中选择每分钟的费用(使用我刚刚选择的目的地国家/地区代码)

然后将每个国际呼叫的持续时间和每分钟成本(CPM)相乘,并将其添加到名为total的变量中,该变量最后显示给用户。

现在,我能用任何我想要的东西来写这个,我能在大约30分钟内做到这一点。但是,我被告知必须在SQL中编写绝大部分内容。

所以我谷歌搜索了一下并决定使用存储过程,所以:

如何遍历第一个选择查询的结果?如果这是在ColdFusion或PHP中,我只是将结果放在一个数组中 - 但我还没有找到一种方法将一个查询的结果插入到SQL中的数组中。

第二:有没有办法压缩这些步骤?

例如:

total = 0
select destinationareacode, duration from phonelogs, where destination=international 
for each record, select CPM from rates, where areacode = (record.destinationareacode)
 total+=CPM*(duration/60)

然后将总数显示给用户。

无论如何......澄清我的问题:

如何遍历一组查询结果?是否可以在遍历这些结果时执行另一个查询,将结果本身(areacode)用作该查询中的条件?

很抱歉,如果这一切看起来很复杂,我不确定如何回答我的问题。

2 个答案:

答案 0 :(得分:2)

你可能想要像

这样的东西
select rates.areacode, sum(cpm*(duration/60))
from  phonelogs
    join rates on rates.areacode = phonelogs.destinationareacode
where phonelogs.destination = 'international'
group by rates.areacode 

理论上,这将按区号给出日志中所有电话的总费用。我显然不知道它是否适合你,不知道表等,但这应该让你知道去哪里。 一般,如果你想在sql中做一个循环,你做错了。

答案 1 :(得分:2)

您已经习惯于imperative programming种语言(其中一种语言明确定义了机器的状态以及从操作到操作的执行控制流),而SQL则更多declarative(其中一种只是表达)计算逻辑)。

这是一个非常不同的paradigm非常值得花一些时间学习,尤其是因为它在关系数据库领域非常有用(并且有点无处不在),但也因为人们可以学到很多关于编程的知识通常来自研究替代范式。

在您的情况下,您要做的是选择每个通话的持续时间(以分钟为单位)的总和,再乘以每分钟的费用:

SELECT SUM(duration/60 * CPM)

您从phonelogsrates表中获取此数据,并加入区号:

FROM   phonelogs JOIN rates ON rates.areacode = phonelogs.destinationareacode

就是这样(除非有任何歧义,否则对于带有表标识符的限定列除外):

SELECT SUM(phonelogs.duration/60 * rates.CPM)
FROM   phonelogs JOIN rates ON rates.areacode = phonelogs.destinationareacode