【问题标题】:Update 3rd table based on date range from another table根据另一个表的日期范围更新第三个表
【发布时间】:2022-01-23 12:52:44
【问题描述】:

我在 MySQL 中有两个表。第一个表“table1”记录特定项目的一个月中所有天的每日数据。像这样-

id Item Date num_of_items
1 Bag 2021-12-01 2
2 Bag 2021-12-02 3
3 Bag 2021-12-03 4
4 Bag 2021-12-04 2
5 Bag 2021-12-05 7
6 Pencil 2021-12-01 2
7 Pencil 2021-12-02 4
8 Pencil 2021-12-03 1
9 Pencil 2021-12-04 5
10 Pencil 2021-12-05 2

如果该月有任何数量的项目需要,这将持续到第 31 天。

第二个表“table2”包含项目的费率,因为它在一个月内发生变化,并且不是恒定的。它看起来像这样 -

id Month Year Item Entry Date Final Date Rate
1 December 2021 Bag 2021-12-01 2021-12-02 10
2 December 2021 Bag 2021-12-03 2021-12-05 12
3 December 2021 Pencil 2021-12-01 2021-12-03 5
4 December 2021 Pencil 2021-12-04 2021-12-05 3

例如,要计算当月 Bag's 的总价值,第 1 天 + 第 2 天数量的前两天的比率为 10; 10x6 = 60 加上剩余 3 天的费率 12 - 12x(2+5+1) = 96,总共 156 个行李箱。

我想在使用触发器更新它的那一刻用当月每个项目的总值更新第三个表“table3”。第三张桌子看起来像这样 -

id Item Month Year total
1 Bag 12 2021 156
2 Pencil 12 2021 56

我知道如何手动获取我想要的值并使用它更新 table3,但不知道如何使用触发器自动执行此操作,该触发器在数据插入或更新到 table2 时更新 table3。

我该怎么做这样的事情?

【问题讨论】:

    标签: mysql datetime


    【解决方案1】:

    这是一个日期范围查找问题。

    您的第一步是使用来自table2 的适当rate 创建一个包含table1 行的结果集。通过查找日期范围包含datedatetable2 行来确定适当的比率。

    使用 JOIN 的 ON 子句做到这一点。 (fiddle here)

    SELECT o.id, o.item, 
           MONTH(o.date) month,
           YEAR(o.date) year,
           o.num_of_items,
           r.rate
      FROM table1 o
      LEFT JOIN table2 r
                ON o.item=r.item
               AND o.date >= r.entry_date
               AND o.date <= r.final_date;
    

    查询的最后两行是将table1.date 放置在日期范围内的技巧。聪明的开发人员会关注这个结果集以确保它是正确的。 (日期范围的内容可能很难正确处理。)

    然后,将查询转换为 GROUP BY 就很容易了。 (fiddle)

    SELECT o.item, 
           MONTH(o.date) month,
           YEAR(o.date) year,
           SUM(o.num_of_items * r.rate) total
      FROM table1 o
      LEFT JOIN table2 r
                ON o.item = r.item
               AND o.date >= r.entry_date
               AND o.date <= r.final_date
    GROUP BY o.item, MONTH(o.date), YEAR(o.date);
    

    还有一件事。避免使用触发器并使用此信息更新第三个表可能是明智之举。相反,使用视图。这样你的数据就不会不一致。 (fiddle)

    CREATE OR REPLACE VIEW totals AS
    SELECT o.item, 
           MONTH(o.date) month,
           YEAR(o.date) year,
           SUM(o.num_of_items * r.rate) total
      FROM table1 o
      LEFT JOIN table2 r
                ON o.item = r.item
               AND o.date >= r.entry_date
               AND o.date <= r.final_date
    GROUP BY o.item, MONTH(o.date), YEAR(o.date);
    
    SELECT * FROM totals;
    

    【讨论】:

    • 非常感谢您的回答。通常我会使用视图,但我打算使用从查询中获得的值来做其他事情,而不仅仅是显示它,因此我没有这样做。
    • 如果可以请指导我如何将触发器设置到另一个非常有用的表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多