【问题标题】:getting the total consumption获取总消费量
【发布时间】:2013-09-10 14:52:27
【问题描述】:

如果我有以下表格:

create table rar (
rar_id int(11) not null auto_increment primary key, 
rar_name varchar (20)); 

create table data_link(
id int(11) not null auto_increment primary key,
rar_id int(11) not null,
foreign key(rar_id) references rar(rar_id));

create table consumption (
id int(11) not null,
foreign key(id) references data_link(id),
consumption int(11) not null,
total_consumption int(11) not null, 
date_time datetime not null);

我希望总消耗量是所有消耗量字段值的总和。有没有办法通过触发器来实现这一点?还是我每次都需要读取所有值+最新值,总结它们然后更新表格?有一个更好的方法吗?

--------------------------------------------------
id | consumption | total_consumption | date_time  |
==================================================|
1  |      5      |         5         | 09/09/2013 |
2  |      5      |         10        | 10/09/2013 |
3  |      7      |         17        | 11/09/2013 |
4  |      3      |         20        | 11/09/2013 |
--------------------------------------------------

只是想知道每次添加新条目时是否有一种更简洁、更快捷的方法来获取总数?

或者这可能是糟糕的设计?最好有类似的东西: SELECT SUM(consumption) FROM consumption WHERE date BETWEEN '2013-09-09' AND '2013-09-11' 为了获得此类信息……这样做是最好的选择吗?我看到的唯一问题是相同的命令将被重新运行多次 - 每次数据都不会被存储,因为它会被请求检索......当你重新生成时它可能效率低下为查看目的多次重复相同的报告...而不是如果已经计算了总数,您所要做的就是读取数据,而不是一次又一次地计算它...想法?

任何帮助将不胜感激......

【问题讨论】:

  • 我不确定我是否会将总消费量保留为自己的列。存储 ID、消费和日期……然后在需要时使用 sum 语句提取 total_consumption。
  • 也许这可以帮助你:stackoverflow.com/questions/17664436/…你可以不用存储“累积和”,并即时计算
  • 或者像SELECT SUM(consumption) from consumption;一样使用view

标签: mysql sql


【解决方案1】:

如果您在 total_consumption 上有一个索引,它不会显着减慢查询速度,以便将嵌套选择 MAX(total_consumption) 作为插入的一部分,因为最大值已被存储。

例如。

INSERT INTO `consumption` (consumption, total_consumption) 
VALUES (8, 
    consumption + (SELECT MAX(total_consumption) FROM consumption)
);

我不确定您如何使用 id 列,但您可以轻松地向嵌套选择添加条件来控制它。

如果您确实需要在嵌套选择上放置 WHERE,请确保在您使用的字段和 total_consumption 列之间有一个索引。例如,如果您将其设为... WHERE id = x,则需要在(id, total_consumption) 上建立索引才能使其高效工作。

【讨论】:

    【解决方案2】:

    如果你必须有触发器 - 它应该是这样的:

    DELIMITER $$
    
    CREATE
    TRIGGER `chg_consumption` BEFORE INSERT ON `consumption` 
    FOR EACH ROW BEGIN
    
    SET NEW.total_consumption=(SELECT 
                                MAX(total_consumption)+new.consumption 
                               FROM consumption); 
    END;
    $$
    
    DELIMITER ;
    

    附言并使total_consumption int(11) not null, 可以为空或默认为0

    编辑: 从SUM(total_consumption) 改进MAX(total_consumption) 作为@calcinai 建议

    【讨论】:

      猜你喜欢
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 2020-08-05
      • 2016-03-11
      • 2021-11-14
      相关资源
      最近更新 更多