mysql - MySQL新用户while循环问题

标签 mysql sql

我必须在工作项目中使用它,但遇到了一些麻烦。我有一个大型数据库(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/

相关文章:

mysql - SQL select total 并分为成功和失败

MySQL 查询有特定的约束吗?

mysql - SSIS包仅在Windows帐户登录服务器时执行

mysql - SQL 用于根据评分获取顶级用户并使用结果获取其他数据

mysql - 数据库表和关系

mysql - 根据主键插入或更新

mysql - SQL - 计算具有特定值的行

mysql - 选择行 <= 值

php - 一个一个展示结果

php - 将 CSV 文件转换为 Mysql 数据库 PHP