PLOT:我有一个有2个DB的PAD网站:submitdata和maindata。 submitdata DB将所有列作为maindata DB加上另外3列:
MAINDATA COLUMNS:名称链接电子邮件网站.... progid SUBMITDATA COLUMNS:名称链接电子邮件网站.... progid,backlink,affiliateid
我必须将所有行从submitdata DB移动到maindata DB,但只有IF反向链接!=''和IF affiliateid!= $ affiliateid。
另一个问题是如果progid已经在maindata数据库中,并且在这种情况下我必须使用新数据更新该行 ...另一个问题是我有大约40,000行,所以SELECT * FROM submitdata有点杀了我的电脑。
有关如何在PHP中执行此操作的任何想法吗?
答案 0 :(得分:1)
试试这个:
EXPLAIN SELECT * FROM submitdata;
也许它会告诉你哪些字段可以给INDEX(这可以大大加快查询时间)。然后,如果您不打算移动其反向链接和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
}
}
}
答案 1 :(得分: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 = ...
基本上,子查询得到的所有行都符合反引号!=''和affiliate!= affiliateid的条件。 MySQL将尝试将它们插入到MainData中,如果该行已存在(基于PK / UK),它将更新您在SET子句中给出的列。
注意:如果两个DB都在一个mysql服务器下,该方法将起作用。