新的MySQL用户while循环问题

时间:2015-11-20 19:16:28

标签: mysql sql

我必须将它用于工作中的项目,并且遇到了一些麻烦。我有一个大型数据库(58mil行),我已经找到了如何查询我想要的内容,然后将此行写入一个单独的表。到目前为止,这是我的代码:

insert into emissionfactors(pollutantID,fuelTypeID,sourceTypeID,emissionFactor)
select pollutantID,fuelTypeID,sourceTypeID,avg(ratePerDistance) as emissionFactor
from onroad_run_1.rateperdistance 
    where pollutantID=45
    and fuelTypeID=2
    and sourceTypeID=32;

我有大约60种不同的污染物ID,目前我手动更改第5行的污染物ID号并执行脚本将该行写入我的排放因子'表。每次运行需要45秒,我还有其他几种燃料类型和源类型,这可能需要每45秒点击8小时。我在matlab上接受了一些培训,并且认为我可以在上面的代码中放置一个while循环,创建一个索引,并让它在污染物ID上从1到184循环,但我似乎无法让它工作。

以下是我的目标: - 将污染物ID从1循环到184。 - 并非所有整数都在此范围内,因此需要将其简单地添加到索引中,并检查在找不到索引时是否在污染物ID列中找到该数字。 - 如果在污染物ID列中找到索引号,请执行上面的代码将数据写入我的其他表

1 个答案:

答案 0 :(得分:0)

你不需要一个while循环,你只需要改变你的where子句以使用BETWEEN子句,并通过添加GROUP BY子句告诉它你想要平均的基础

insert into emissionfactors(pollutantID,fuelTypeID,sourceTypeID,emissionFactor)
select pollutantID,fuelTypeID,sourceTypeID,avg(ratePerDistance) as emissionFactor
from onroad_run_1.rateperdistance 
    where pollutantID BETWEEN 1 AND 184
    and fuelTypeID=2
    and sourceTypeID=32
GROUP BY pollutantID , fuelTypeID, sourceTypeID;

如果你实际上想要存在的污染物ID,fuelTypeID和sourceTypeID的整个范围,你可以完全删除where子句。

insert into emissionfactors(pollutantID,fuelTypeID,sourceTypeID,emissionFactor)
select pollutantID,fuelTypeID,sourceTypeID,avg(ratePerDistance) as emissionFactor
from onroad_run_1.rateperdistance 
GROUP BY pollutantID , fuelTypeID, sourceTypeID;

在执行查询之前,您也不需要检查该行是否存在,就好像它不存在并且不返回它刚刚赢得的行而不插入任何行。

关于速度问题,您需要查看向表中添加一些表索引以提高性能。在这种情况下,具有污染物ID,fuelTypeID和sourceTypeID的索引会大大加快速度。

我的建议,在工作中寻求帮助。最好早点承认你不知道如何做某事并获得适当的帮助,因为你还提到你有不同的燃料类型,但你的问题中没有详细说明。