2009-11-19 82 views
0

如果我有两个表,列出如下,第一个显示的原始数据和保持原始数据的压缩版本第二:插入不查询和更新差异

raw_table:

val 
1 
1 
2 
2 
2 
3 
3 
4 

comp_table:

val  count 
1   2 
2   3 
3   2 
4   1 

我要压缩的raw_data在另一张表

INSERT INTO comp_table VALUES (
    SELECT val, COUNT(val) FROM raw_table 
    WHERE val NOT IN(
     SELECT val FROM comp_data 
    ) GROUP BY val 
) 

第一个问题: 是上面的语法是否正确?

第二个问题: 计数已更新,执行更新的最有效的查询是什么?

注:数据大小超过了raw_table

感谢一百万条记录提前:d

回答

1

该查询可能会工作,但是这是一个很好的使用情况对重复密钥更新:

INSERT INTO comp_table (val, val_count) 
SELECT 
    val, 1 
FROM comp_data 
ON DUPLICATE KEY UPDATE val_count = val_count + 1; 

第一次插入查询运行时,它会插入值和计数设置为1之后的任何时间,相同的值被插入时,计数将递增。

注意:为此,您必须在comp_table中的val列上具有唯一键。

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

+0

泰:d我看到它是如何工作:d – 2009-11-19 02:56:19

0

从我从Bradym有:幸得他

INSERT INTO comp_data 
    SELECT val, COUNT(val) FROM raw_data GROUP BY val 
ON DUPLICATE KEY 
    UPDATE 
    count = (SELECT COUNT(val) FROM raw_data WHERE raw_data.val = comp_data.val) 

久经考验:d