【问题标题】:mysql update table from another tablemysql 从另一个表更新表
【发布时间】:2011-03-05 13:34:37
【问题描述】:

我正在尝试根据另一个表中另一个字段的总和来更新一个表中的字段。

company_tbl (PRIMARY, companySize, companyName) 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。

谢谢!

【问题讨论】:

    标签: mysql sql aggregate-functions mysql-error-1111


    【解决方案1】:

    用途:

    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
    

    【讨论】:

    • 对您的查询稍作更新。 WHERE lt.companyid = comp.primary 否则每个 companySize 都将是相同的 :-) 所以我认为不可能用这种语法进行更新? update company_tbl comp, location_tbl loc set companySize = sum(locationSize) where comp.PRIMARY = loc.companyID 只是出于好奇,我喜欢学习新事物 :-)
    • @Idealflip:如果没有表别名(通常在 UPDATE 语句中不接受),那么没有表别名的列引用适用于没有定义任何别名的表。
    • 你应该使用视图。除非您绝对需要针对公司规模的读取进行优化,否则最好每次都计算它。如果您可以从另一列中计算出一列的值,那么您就是在为这两个值不同步的情况做好准备。
    【解决方案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;
    

    在它处理完每家公司的所有匹配位置后,您将获得所需的总和。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多