2009-08-01 105 views
23

了2桌/实体,非常简单的场景。MySQL的:从一数个表中的记录,然后更新另一个

诗人 - 列:ID,诗人,国家

国家 - 列:ID,民族,数

基本上,国家诗人有一个的映射很多,自然而然。例如,来自60个国家的1000位诗人。在诗人每个诗人是通过其中包含的国家之一,在国家的ID民族领域分配给国家。

各国的计数字段包含诗人这个国家的诗人数。

我的问题是如何使用只有一个SQL查询来统计诗人国家的诗人数,然后更新该国的相应计数?

我想:

UPDATE poets, nations SET nations.count = COUNT(poets.id) GROUP BY poets.nation HAVING poets.nation = nations.id 

但它给#1064错误。还尝试在某处合并WHERE子句,但它仍然拒绝工作。

有什么想法?

回答

32

使用子查询:

UPDATE nations 
    SET count = (
     SELECT COUNT(id) 
     FROM poets 
     WHERE poets.nation = nations.id 
     GROUP BY id 
     ); 
+0

谢谢,这有效果! – 2009-08-01 08:42:37

+6

请注意,对于非常大的表格(500000+条记录),这可能会变得非常缓慢。 – dusoft 2009-08-01 09:07:21

18

你只是不需要GROUP BY,参见:

UPDATE nations SET count = (
    SELECT COUNT(id) FROM poets 
    WHERE poets.nation = nations.id); 

或者更确切地说,与GROUP BY,子查询将返回NULL对于没有国家诗人。没有GROUP BY的情况下,子查询将返回0。

相关问题