2011-11-04 198 views
1

PLOT:我有一个有2个DB的PAD网站:submitdata和maindata。 的submitdata DB具有所有列的maindata DB加上另外3列:mysql - 将行从一个表格移动到另一个表格或更新

MAINDATA列:名称链接的电子邮件网站....进程id SUBMITDATA列:名称链接的电子邮件网站....进程id,反向链接,AFFILIATEID

我必须将所有行从submitdata DB移动到maindata数据库,但只有IF反向链接!=''和IF affiliateid!= $ affiliateid。

的另一个问题是,如果该进程id是媒体链接在maindata DB和它这种情况下,我必须更新与新的数据 该行......另一个问题是,我有大约40.000行,以便SELECT * FROM submitdata还挺杀死我的电脑 。

关于如何在PHP中做到这一点的任何ideea?

回答

1

试试这个:

EXPLAIN SELECT * FROM submitdata; 

也许它会告诉你哪些字段,你可以给一个索引(这可能加快查询时间大大)。然后,如果您不打算移动反向链接和affiliateid字段为空的记录,则可以通过添加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 
     } 
    } 
} 
+0

uuhuuu ...那是一些不错的代码!感谢BUNCH!将发布结果..再次感谢! –

+0

不客气!希望它能解决..只有我知道是否有任何差异。 –

+0

是的男人,让它工作。仍然有执行时间的一些问题,我仍然超载服务器,但嘿..它的作用就像将数据从一个表移动到另一个表......嘿! :)更新和插入后还添加了删除行。 –

1

你可以采取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 = ... 

基本上子查询得到满足的是反引号!=“”和会员!= AFFILIATEID条件的所有行提交。 MySQL会尝试将它们插入到MainData中,如果该行已经存在(基于PK/UK),它将更新您在SET子句中给出的列。

注意:如果两个数据库都在一个mysql服务器下,该方法将工作。

相关问题