Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
新MySQL用户while循环问题_Mysql_Sql - Fatal编程技术网

新MySQL用户while循环问题

新MySQL用户while循环问题,mysql,sql,Mysql,Sql,我不得不把它用于工作中的一个项目,我遇到了一些麻烦。我有一个大型数据库(58mil行),我已经知道如何向下查询到我想要的内容,然后将这一行写入一个单独的表中。以下是我目前的代码: insert into emissionfactors(pollutantID,fuelTypeID,sourceTypeID,emissionFactor) select pollutantID,fuelTypeID,sourceTypeID,avg(ratePerDistance) as emissionFacto

我不得不把它用于工作中的一个项目,我遇到了一些麻烦。我有一个大型数据库(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行的pollutantID编号,并执行脚本将该行写入我的“emissionfactors”表。每次运行需要45秒,我还有其他几种燃料类型和燃料源类型,所以每45秒点击一次可能需要8小时。我在matlab中接受了一些培训,我想我可以在上面的代码周围循环一段时间,创建一个索引,让它在污染物ID上从1循环到184,但我似乎无法让它工作

以下是我的目标: -将污染物从1循环到184。 --并不是所有整数都在这个范围内,所以只需将一个整数添加到索引中,如果找不到索引,则检查pollutantID列中是否找到该数字。
--如果在“污染物ID”列中找到索引号,请执行我的上述代码将数据写入我的另一个表中

您不需要while循环,只需将where子句更改为使用BEVERY子句,并通过添加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;
如果事实上您想要存在的pollutantID、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;
您也不需要在执行查询之前检查行是否存在,就好像它不存在并且不返回任何行一样,它只是不插入任何行

至于速度问题,您需要考虑向表中添加一些表索引以提高性能。在这种情况下,包含pollutantID、fuelTypeID和sourceTypeID的索引将大大加快速度


我的建议是,在工作中寻求帮助。最好尽早承认你不知道如何做某事并获得适当的帮助,因为你还提到你需要不同的燃料类型,但你的问题中缺少这些燃料的细节。

你已经将其标记为mysql和oracle。你实际上是在使用这两种类型吗?我假设你没有使用Oracle,因为你的标题上写着MySQL,而你发布的代码在Oracle中无效。它在任何数据库中都不应该有效,但MySQL是“有用的”。您有一个聚合函数
avg
,以及一些非聚合列,但您没有执行
分组依据
。在这种情况下,数据库应该需要一个
groupby
。在答案中包含一个
groupby
,然后使用
between
语法。@justin如果您对Oracle标记的看法正确,我正在使用MySQL。再次抱歉,这里的新用户,我正在尽我所能轻松完成这项工作。感谢您的帮助,让我试试您的建议。我在1和6之间进行了一次测试运行
,其中包括没有相应污染物ID(1,2,3,4)的数字和两个具有唯一污染物ID(5,6)的数字。输出仅返回了1行,其中包含
排放因子
,作为污染物5和6的两个单独排放因子的总和,而不是两个单独的行,其中包含不同污染物的各自排放因子。还有其他建议吗?编辑:我会在工作中寻求帮助,但我们是一家环境咨询公司&除了我之外,没有人有过编码经验。哈哈,我必须从一开始就学习MySQL,才能完成这个项目!啊,那是因为您在select语句中添加了平均值(ratePerDistance)。您希望平均值基于什么?因此,对于每个vehicleID和fuelTypeID,我的程序有60个污染物的输出。每个污染物都有300-400个不同的
ratePerDistance
值。我需要对应于vehicleID、fuelTypeId和pollutantID的这些值的平均值。我希望这是有道理的,如果您需要进一步的帮助,请告诉我explaination@Dijkgraff哦,谢谢你的帮助。我很高兴我几乎是一个人到的,但是如果没有你,我不可能这么容易做到。再次感谢你!!