2011-03-31 68 views
2

我將數據導入結構表:CONTENT_ID | USER_ID |計數 - 所有整數都包括複合主鍵MySQL的 - 滿足複合主鍵,同時使用「插入XXX選擇」

表我要選擇它的結構:CONTENT_ID | USER_ID

對於相當具體到我的使用情況的原因,我需要火相當大量的數據到這個規律的,並且希望一個純粹的MySQL解決方案

insert into new_db.table 
select content_id,user_id,xxx from old_db.table 

我想每一行進入xxx設置爲0,你不幸的是,這將創建一個重複的密鑰,在這種情況下,我希望增加數量,對於當前的user_id/content_id組合

不是MySQL專家,我嘗試了一些選項,如嘗試從目標中選擇填充xxx在插入期間的表,沒有運氣。還嘗試使用ON DUPLICATE KEY增加計數器而不是通常的UPDATE。但這一切似乎都有些蠢,所以我想我會來這裏!

任何想法的人?我有一個用PHP包裝這個備份選項,但它會大大提高腳本的整體運行時間,在這個腳本中,這將是唯一的非純MySQL部分

任何幫助真的很感激。提前致謝!

- 編輯

原則上這聽起來真的很糟糕。但是id已經解決了在輸入隨機數字(我發送了隨機數字讓我繼續進行其他工作)之後進行更新的一種方式 - 這是純粹的開發設置

- 再次編輯

12|234 
51|45 
51|45 
51|45 
23|67 

在理想情況下插入

12|234|0 
51|45|0 
51|45|1 
51|45|2 
23|67|0 

回答

0
INSERT INTO new_db.table (content_id, user_id, cnt) 
SELECT old.content_id, old.user_id, COUNT(old.*) - 1 FROM old_db.table old 
GROUP BY old.content_id, old.user_id 

這將是我會去的方式,所以如果1項那就把0的CNT,更多的將只是把1-2- 3等

編輯:

你正確的答案應該是有點複雜,但我測試了它和它的作品:

INSERT INTO newtable(user_id,content_id,cnt) 
SELECT o1.user_id, o1.content_id, 
    CASE 
     WHEN COALESCE(@rownum, 0) = 0 
     THEN @rownum:=c-1 
     ELSE @rownum:[email protected] 
    END as cnt 
FROM 
(SELECT user_id, content_id, COUNT(*) as c FROM oldtable 
GROUP BY user_id, content_id) as grpd 
LEFT JOIN 
(SELECT oldtable.* FROM oldtable) o1 ON 
(o1.user_id = grpd.user_id AND o1.content_id = grpd.content_id) 
; 
+0

謝謝。我只是在一小部分數據上試了一下,似乎是刪除了重複項,然後提供了有多少'_were_'而不是保留它們並從零枚舉它們。不知道如果我解釋正確,但我希望所有的舊數據進去 - 使用名爲計數列是無益的我知道 - 我沒有選擇目的地結構; o) – joevallender 2011-03-31 08:29:15

+0

可以請你給一個小數據樣本,爲什麼你需要提出疑問,因爲我認爲目前還不清楚。 – frail 2011-03-31 08:42:04

+0

肯定的事情。看到原來的問題,我在那裏添加了它。 這有幫助嗎?抱歉不清楚,謝謝你看看! – joevallender 2011-03-31 08:50:28

0

假設在舊的數據庫表(源),你不會有相同(content_id,user_id)的組合,那麼你可以導入使用此查詢

insert newdbtable 
select o.content_id, o.user_id, ifnull(max(n.`count`),-1)+1 
from olddbtable o 
left join newdbtable n on n.content_id=o.content_id and n.user_id=o.user_id 
group by o.content_id, o.user_id;