2010-06-18 166 views
2

我试图从另一个表中的另一个字段的总和更新一个表中的一个字段。mysql从另一个表更新表

company_tbl(PRIMARY,companySize,公司名称) location_tbl(PRIMARY,companyID,locationSize,LOCATIONNAME)

两个表由company_tbl.PRIMARY = location_tbl.companyID

update company_tbl comp, location_tbl loc 
set companySize = sum(locationSize) 
where comp.PRIMARY = loc.companyID 

我越来越链接“无效使用群组功能”的错误

公司可以有多个地点

是我想做的事情吗?我想获取属于特定公司的地点总数,并用总和更新companySize。

谢谢!

回答

9

用途:

UPDATE company_tbl comp 
    SET companySize = (SELECT SUM(lt.locationSize) 
         FROM location_tbl lt 
         WHERE lt.companyid = comp.primary) 

... or you could use a view,包含:

SELECT c.primary, 
      COALESCE(SUM(lt.locationsize), 0) AS companysize 
    FROM company_tbl c 
LEFT JOIN location_tbl lt ON lt.companyid = c.primary 
+0

对您的查询进行一些更新。 WHERE lt.companyid = comp.primary 否则每companySize将是相同的:-) 所以我把它这是不可能做到的更新与此语法? 更新company_tbl补偿,location_tbl禄 集companySize = SUM(locationSize) 其中comp.PRIMARY = loc.companyID 只是出于好奇,我喜欢学习新的东西:-) – Kukoy 2010-06-18 18:15:27

+0

@Idealflip:如果没有表的别名(一般在UPDATE语句中不被接受),那么没有表别名的列引用适用于没有定义任何别名的表。 – 2010-06-18 18:17:31

+0

您应该使用该视图。除非您绝对需要针对公司规模的读取进行优化,否则最好每次计算一次。如果您可以计算另一列中的某一列的值,则可以设置自己的状态,以使两个值不同步。 – Kendrick 2010-06-18 18:23:27

2

首先初始化companySize为零:

UPDATE company_tbl SET companySize = 0; 

然后对每个匹配的位置排,加locationSize:

UPDATE company_tbl comp JOIN location_tbl loc ON comp.PRIMARY = loc.companyID 
SET comp.companySize = comp.companySize + loc.locationSize; 

在您为每家公司处理完所有匹配位置之后,您会得到所需的金额。