2013-02-28 132 views
0

我有3个表a b c AB和C都通过一个ID相关a.id = b.id = c.idMysql的选择多条记录

我的任务是选择AB所有行和c其中a.date是超过6个月,并将其插入到一个新的数据库进行归档。

这是我到目前为止有:

insert into dbArchive.a select * from db.a where receivedDate < CURRENT_DATE() - INTERVAL 6 MONTH;` 

这似乎选择表中的所有条目是超过6个月,并把它们插入到归档数据库表。

什么是最好和最有效的方式来查找表b和c中具有相同id的所有行并将它们插入归档db表b和c?

我有超过100万条超过6个月的记录,所以我对性能问题感到厌倦。

回答

0

所以玩了一段时间后,这似乎是最好的方法,我发现,实际工作:

INSERT INTO archive.b SELECT * FROM db.b WHERE `id` IN(SELECT `id` FROM archive.a) 

我不知道这是否是最有效的方法,但它得到的完成任务

+0

是的。这工作。我有点过度思考。它需要知道如何使用'SELECT','JOIN',内部查询来正确查找效率。在这里,我认为这是更有效的,因为不使用'JOIN'。如果你有时间,你可以测试它们并让我们知道。 – chandimak 2013-03-05 07:02:43

0

在您插入到dbArchive.a之后,您可以执行以下操作以插入dbArchive.bdbArchive.c的相同方式。

INSERT INTO dbArchive.b(id, etc..) 
    SELECT db.b.id, etc.. 
    FROM dbArchive.a INNER JOIN db.b ON dbArchive.a.id = db.b.id; 
+0

好的......我可以使用'SELECT'与'VALUES(....)'来简单地复制一切与指定列?加入表格时以及插入与选择相结合时,我总是感到困惑。 – 2013-02-28 06:57:01

+0

查看编辑答案。它有一些错误。是的,你可以如果列匹配的值。如果您为所有列传递值,但您需要指定'SELECT'列作为dbArchive.a'和'db.b'中的值,则可以省略'INSERT INTO'中的列名。 – chandimak 2013-02-28 07:20:19

+0

我一直在玩这个。这不是很有效,但它很接近。我有以下几点:'SELECT rdo.qs_mailContent.id,rdo.qs_mailContent.bodyText,rdo.qs_mailContent.bodyHTML,rdo.qs_mailContent.headers FROM qs_mailArchive.qs_mail INNER JOIN rdo.qs_mailContent ON qs_mailArchive.qs_mail.id = rdo.qs_mailContent。 id LIMIT 10'这将返回带有以下ID的结果:'2 5 7 118 ....'如果我将此语句更改为以下内容:'SELECT * FROM qs_mailArchive.qs_mail INNER JOIN rdo.qs_mailContent ON qs_mailArchive.qs_mail.id = rdo.qs_mailContent.id limit 10' .... – 2013-03-04 08:38:00