2013-02-28 131 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