2009-11-11 48 views
1

你好 - 我是MySQL Noob。我有一個各種商業列表的表,我試圖填充第二個表,稱爲城市,其中包含獨特的城市名稱以及每個城市有多少列表。我能夠做的SELECT語句讓我這個數據細,像這樣:MySQL INSERT INTO/ON複製鍵與SELECT語句問題

SELECT city,state,sum(count) 
FROM (
SELECT city,state, 1 AS count FROM listings 
) results 
GROUP BY city 
ORDER BY sum(count) DESC,city; 

不過,現在我想更新表,但我似乎無法得到適當的語句來工作。這是我擁有的最新版本,但是我目前收到「無效的組功能使用」錯誤。

INSERT INTO cities(city,state,size) 
SELECT city,state,sum(count) 
FROM (
SELECT city,state, 1 AS count FROM listings 
) results 
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), size=sum(count); 

任何幫助表示讚賞!

回答

3

會這樣簡單的工作?

insert into cities (city, state, size) 
select city, state, count(*) as size from listings 
group by city, state 

group by應確保有沒有重複,這樣就沒有必要爲on duplicate key。你正在做的sum()+子查詢的事情看起來像你只是想做一個計數(*)。

你得到的具體錯誤是因爲size = sum(count)。在批量插入中,正確的方法是size = values(size),請參閱values()上的文檔。

編輯:

如果它增加了對每個城市的另一個項目則沒有在城市和重複鍵唯一索引不會做任何反正。

如果您在(城市,州)添加唯一索引,則可以將on duplicate key update size=values(size)添加到上述查詢中,並且它會更新每個記錄。

+0

我想我們只是發佈了相同的查詢。 – Dereleased

+0

嗯,這個工程,但它似乎是爲每個重複的城市增加另一個條目與更新以前的條目。我想這就是我通過聲明中的「重複關鍵更新」部分得到的結果。 – sepulturkey

+0

如果您首先對錶格進行分段,則不需要使用DUPLICATE KEY。但如果你真的想要UN DUPLICATE KEY(這並不是一個糟糕的方法),那麼你需要在(城市,州)上有一個PRIMARY或UNIQUE鍵,而你可能沒有這個鍵。 – longneck

0

試試這個,雖然我希望在將它釋放給你之前,我有些事情要對它進行測試。

insert into cities (city, state, size) 
select city, state, count(*) AS size 
from listings 
group by city, state