情节:我有一个有2个数据库的PAD网站:提交数据和主要数据。submitdata DB的所有列都是maindata DB,另外还有3列:
MAINDATA列:名称链接电子邮件网站....progid SUBMITDATA列:名称链接电子邮件网站....progid、反向链接、关联
我必须将所有行从submitdata DB移动到maindata DB,但只有在反向链接!='‘和affiliateid != $affiliateid的情况下。
另一个问题是,如果progid在maindata DB中已经准备就绪,那么在这种情况下,我必须用新数据更新该行……另一个问题是,我有大约40.000行,所以SELECT * FROM submitdata有点杀死我的计算机。
有没有关于如何在PHP中做到这一点的想法?
发布于 2011-11-05 06:41:24
试试这个:
EXPLAIN SELECT * FROM submitdata;也许它会告诉您可以为哪些字段建立索引(这可以大大加快查询时间)。然后,如果您不打算移动其反向链接和关联if字段为空的记录,则可以通过添加WHERE子句来减少查询的结果集。
$result = mysql_query('SELECT * FROM submitdata WHERE backlink <> "" AND affiliateid <> ""');
if ($result) {
while ($row = mysql_fetch_assoc($result)) {
$newResult = mysql_query(sprintf('SELECT name,progid FROM maindata WHERE progid = %d', $row['progid']));
$row2 = mysql_fetch_row($newResult);
if ($row2) {
// do UPDATE query
} else {
// do INSERT query
}
}
}发布于 2011-11-05 07:41:58
你可以使用MySQL帮助,让它做所有的工作,而不是在应用层做这些工作。构建查询,然后使用PHP/Perl等提交查询。
INSERT INTO MAINDATA
(col1, col2, col3....)
SELECT col1, col2... FROM
(
SELECT col1, col2...
FROM SUBMITDATA SD
LEFT OUTER JOIN MAINDATA MD
ON SD.key1 = MD.key1 and SD.key2 = MD.key
WHERE
SD.backlink <> ''
AND SD.affiliate <> '$affiliatiid'
) ND
ON DUPLICATE KEY
SET update_col1 = col1
,update_col2 = ...基本上,子查询获取的是所有满足回号!= '‘和affiliate != affiliateid条件的行。MySQL将尝试将它们插入到MainData中,如果行已经存在(基于PK/UK),它将更新您在SET子句中给定的列。
注意:如果两个数据库都在一个mysql服务器下,则该方法将起作用。
https://stackoverflow.com/questions/8016487
复制相似问题