2011-03-31 66 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;