【问题标题】:Mysql Update Sum Join QueryMysql更新和连接查询
【发布时间】:2019-07-28 08:19:07
【问题描述】:

我在使用 Sum 更新查询时遇到问题。我有两张桌子活动和捐款。我想更新特定活动的每笔捐款总额

tb_campaign

  1. 身份证
  2. 姓名
  3. total_donations

tb_donations

  1. 身份证
  2. amount_donated
  3. campaign_id

我当前的查询不工作

UPDATE
    tb_campaign AS campaigns
    LEFT JOIN (
        SELECT
            sum(amount_donated) AS amount_donated
        FROM
            tb_donations
        GROUP BY
            campaign_id
    ) AS donations ON
        donations.campaign_id = campaigns.id
SET
    campaigns.total_donations = donations.amount_donated;

我的查询出现错误

【问题讨论】:

  • 请添加错误。
  • 您没有在连接子查询中选择campaign_id
  • sql 错误未知列donations.campaign_id in group statement
  • 查看我的第二条评论。
  • 我编辑了我的代码。但仍然有错误。这次“列 total_donations 不能为空”

标签: mysql sql group-by sum sql-update


【解决方案1】:

如果要根据匹配记录更新tb_campaign.total_donations 中的列,请尝试以下更新查询。

UPDATE tb_campaign AS campaigns
        INNER JOIN
    (SELECT 
        campaign_id, SUM(amount_donated) AS amount_donated
    FROM
        tb_donations
    GROUP BY campaign_id) AS donations ON donations.campaign_id = campaigns.id 
SET 
    campaigns.total_donations = donations.amount_donated;

如果您需要更新 tb_campaign 表中与 total_donations 不匹配的所有列,试试这个, 注意: “column total_donations cannot be null”添加了coalesce以避免null

UPDATE tb_campaign AS campaigns
        LEFT JOIN
    (SELECT 
        campaign_id,
            COALESCE(SUM(amount_donated), 0) AS amount_donated
    FROM
        tb_donations
    GROUP BY campaign_id) AS donations ON donations.campaign_id = campaigns.id 
SET 
    campaigns.total_donations = donations.amount_donated;

【讨论】:

    【解决方案2】:

    您在子查询中错过了campaign_id,因此您的加入无法工作,因为没有donations.campaign_id

    UPDATE  tb_campaign AS campaigns
    LEFT JOIN (
            SELECT  campaign_id, sum(amount_donated) AS amount_donated
            FROM  tb_donations
            GROUP BY     campaign_id
        ) AS donations ON  donations.campaign_id = campaigns.id
    SET    campaigns.total_donations = donations.amount_donated;
    

    但由于您正在寻找数学行,因此您的连接条件应该是内部连接

    UPDATE  tb_campaign AS campaigns
    INNER  JOIN (
            SELECT  campaign_id, sum(amount_donated) AS amount_donated
            FROM  tb_donations
            GROUP BY     campaign_id
        ) AS donations ON  donations.campaign_id = campaigns.id
    SET    campaigns.total_donations = donations.amount_donated;
    

    【讨论】:

      猜你喜欢
      • 2015-12-30
      • 2011-12-24
      • 2013-12-10
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 2010-11-06
      相关资源
      最近更新 更多