我必须在工作项目中使用它,但遇到了一些麻烦。我有一个大型数据库(5800 万行),我已经弄清楚如何查询到我想要的内容,然后将此行写入一个单独的表中。这是到目前为止我的代码:
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列中找到索引号,则执行我上面的代码将数据写入我的另一个表
最佳答案
您不需要 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、燃料类型ID 和源类型ID 的整个范围,您可以完全删除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、燃料类型ID和源类型ID的索引将大大加快速度。
我的建议是,在工作中寻求帮助。最好尽早承认您不知道如何做某事并获得适当的帮助,因为您还提到您想要不同的燃料类型,但您的问题中缺少详细信息。
关于mysql - MySQL新用户while循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33834399/