【问题标题】:Update mySQL Table with Results of Aggregate Function使用聚合函数的结果更新 mySQL 表
【发布时间】:2015-10-06 08:42:40
【问题描述】:

我有一个汇总表和一个详细表,其中包含许多不同游戏的分数。明细表包含数百万条记录,而聚合表仅包含每场比赛和不同天数的平均得分。

示例:
聚合表:

|身份证 |姓名 | AVG_SCORE_7_DAYS | AVG_SCORE_30_DAYS | -------------------------------------------------- --- | 1 |游戏1| 10.3 | 20.3 | | 2 |游戏2| 14.3 | 26.3 |

明细表:

|身份证 |姓名 |日期 |分数 | ------------------------------------------ | 1 |游戏1| 2015-07-12 01:00:00 | 20 | | 2 |游戏2| 2015-07-12 01:00:00 | 26 | | 3 |游戏1| 2015-07-12 01:00:00 | 14 | | 4 |游戏2| 2015-07-12 01:00:00 | 9 |

我使用如下代码通过存储过程每晚更新我的聚合表:

UPDATE `aggregate` aggr
INNER JOIN
(
    SELECT game_name, avg(score) AS avg_score
    FROM `detail`
    WHERE `date` BETWEEN (CURDATE() + INTERVAL -7 DAY) AND CURDATE()
    GROUP BY `game_name`
) detail7 ON aggr.`game_name` = detail7.`game_name`
INNER JOIN
(
    SELECT game_name, avg(score) AS avg_score
    FROM `detail`
    WHERE `date` BETWEEN (CURDATE() + INTERVAL -30 DAY) AND CURDATE()
    GROUP BY `game_name`
) detail30 ON aggr.`game_name` = detail30.`game_name`

我遇到的问题是,如果某些游戏在 7 天、30 天等内没有得分,那么这些子查询不会返回任何记录,因此如果其中任何一个失败,那么该游戏的任何列都不会得到更新(由于内部连接)。即使子查询的结果没有返回任何结果,我是否可以编写查询来更新其他列?

【问题讨论】:

  • 你尝试左连接了吗?

标签: mysql sql join sql-update


【解决方案1】:

使用外连接。也可以简化逻辑,只需要一个聚合:

UPDATE `aggregate` aggr LEFT JOIN
        (SELECT game_name,
                avg(case when `date` BETWEEN (CURDATE() + INTERVAL -7 DAY) AND CURDATE() then score end) AS avg_score_07,
                avg(case when `date` BETWEEN (CURDATE() + INTERVAL -30 DAY) AND CURDATE() then score end) AS avg_score_30
         FROM `detail`
         WHERE `date` BETWEEN (CURDATE() + INTERVAL -30 DAY) AND CURDATE()
         GROUP BY `game_name`
        ) detail
        ON aggr.`game_name` = detail.`game_name`
    SET . . . ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多