我将数据导入到一个结构化的表:content_id | user_id | count - 所有整数都包含复合主键
我想从中选择它的表格是: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部分
任何帮助真的很感激。提前谢谢!
- 修改
原则上这可能听起来很糟糕。但是在输入随机数字后,我会在更新中找到一种方法(我已经发送了随机数字以便让我继续其他工作) - 这是一个纯粹的开发设置- 再次修改
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 :(得分: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:=@rownum-1
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)
;
答案 1 :(得分:0)
假设在旧的db表(source)中,你将没有相同的(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;