这个循环的sql怎么样能提高效率?

lfkcn 2011-03-16 04:35:25
循环的php如下:

for($j=0;$j<count($selectscriptresult);$j++){
$scriptid=$selectscriptresult[$j]['id'];
$wats_id=$productName.'_sc_'.$scriptid;
$updateidsql="update `script` set wats_script_id='$wats_id' where id=$scriptid";
$copyproject->query($updateidsql);

$selectoriginalscriptsql="select * from `script` where project=$source_pid";
$selectoriginalscriptresult=$copyproject->query($selectoriginalscriptsql);

$data_tempscript['originalid']=$selectoriginalscriptresult[$j]['id'];
$data_tempscript['originalname']=$selectoriginalscriptresult[$j]['name'];
$data_tempscript['copyid']=$scriptid;
$data_tempscript['copyname']=$selectscriptresult[$j]['name'];
$temp_scriptresult=$temp_script->add($data_tempscript);

}


核心意思就是在一张表中根据一条记录的id来update另外这条记录一个字段。然后去更新另外一张表
目前记录大概有1700条,每次循环个几百次,就失败了,mysql的log中也没有什么体现。
我怀疑是这个循环的效率有问题,请大家帮我看看。
...全文
82 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lfkcn 2011-03-17
谢版主的这条简单的语句,这样是可以的。
我想知道用循环来做会造成mysql效率的问题吗?或者会造成mysql连接有问题吗?
回复
ACMAIN_CHM 2011-03-17
你期望的结果是什么样?

直接 update test1 set temp_id =concat('sc',id); 哪不符合你的要求。
回复
lfkcn 2011-03-17
表结构是这样的

create table test1
(
id varchar(10) AUTO_INCREMENT,
temp_id varchar(10),
name varchar(20)
)
insert into test1(name) values('a1')
insert into test1(name) values('a2')

现在要更新test1中temp_id的值,它的构成规则是这样的,两个字符sc加上id值,像上面两条记录如果id是1和2的话,temp_id就应该是sc_1和sc_2
现在是这样的情况,id值是系统自动生成的,我必须先得到id值,然后再得到temp_id值。
写了一个循环就是类似于顶贴这样的:

for($j=0;$j<count($selectscriptresult);$j++){
$scriptid=$selectscriptresult[$j]['id'];//从这里能得到id值,是另外一个sql得到的
$temp_id='sc_'.$scriptid;
$updateidsql="update `test1` set temp_id='$temp_id' where id=$scriptid";//更新temp_id
$copyproject->query($updateidsql);
}

目前记录大概有1700条,每次循环个几百次,就失败了,mysql的log中也没有什么体现。我怀疑是这个循环的效率有问题,请大家帮我看看。
回复
ACMAIN_CHM 2011-03-17
(不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

回复
lfkcn 2011-03-17
可能是我没有说清楚,数据应该这样的
id temp_id name
1 a
2 b
3 c

temp_id是根据id来做的,比如分别设置为sc_1,sc_2和sc_3,
这样的记录大概有1700条,我是用一个for循环来做的,觉得好像效率不高。

各位给的办法都是还有另外一张表,现在没有那张表啊。
回复
Yuno_Wang 2011-03-17
update table1 ,table2 set table1.col=table2.col2 where table1.id=table2.id 可以么?



回复
gw6328 2011-03-16
[Quote=引用 1 楼 acmain_chm 的回复:]
update table1 inner join table2 on table1.id=table2.id
set table1.col=table2.col2
[/Quote]

学习mysql这样更新啊。
回复
ACMAIN_CHM 2011-03-16
update table1 inner join table2 on table1.id=table2.id
set table1.col=table2.col2
回复
发动态
发帖子
MySQL
创建于2007-09-28

5.4w+

社区成员

MySQL相关内容讨论专区
申请成为版主
社区公告
暂无公告