2009-11-19 112 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