2009-11-11 47 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