【问题标题】:MySQL Sum and Subtract according to the records?MySQL 根据记录求和和减法?
【发布时间】:2011-08-28 21:30:21
【问题描述】:

我在 mysql 中有一条记录,其中包含如下内容:

+15,+23,-21,+23,-3 

我要做的就是在 SQL 查询中根据它们的符号对这些值进行加减运算。

我知道SUM(),但是减法呢?基本上,我需要一些可以在一个查询中执行的东西,比如下面的例子:

SELECT SUM(result) AS 'total' FROM mytable  WHERE year='2011' AND month='10';

【问题讨论】:

  • 它没有恢复...但是我这次用不同的语法尝试了它并且它有效:/
  • 请注意,yearmonth 是保留字,需要用反引号 ` 引用才能正常工作。

标签: mysql row sum add


【解决方案1】:

您的查询将正常工作。测试于

CREATE TABLE `test` (
  `id` int(11) DEFAULT NULL,
  `p` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1

insert into test values(null, 5), (null, -1), (null,4);
select sum(p) from test;

结果是 8。

【讨论】:

    【解决方案2】:

    您在数据库中使用逗号分隔的字段。

    这是一个巨大的 NONO,(My)SQL 并没有很好地处理这个问题。
    如果每行中的值不超过 5 个,则可以执行以下操作:

    代码错误警告

    $month = mysql_real_escape_string($data['month']);
    $year = mysql_real_escape_string($data['year']);
    $sql = "SELECT 
      IFNULL(SUBSTRING_INDEX(result,',',1),0) 
      + IFNULL(SUBSTRING_INDEX(result,',',2),0)
      + IFNULL(SUBSTRING_INDEX(result,',',3),0)
      + IFNULL(SUBSTRING_INDEX(result,',',4),0)  
      + IFNULL(SUBSTRING_INDEX(result,',',5),0) as total_result
    FROM mytable
    WHERE `year` = '$year' AND `month` = '$month' ";
    

    我不能 100% 确定 MySQL 是否会对“+”号感到满意,如果不是,您需要通过 REPLACE(IFNULL(SUBSTRING_INDEX(result,',',2),0),'+','') 过滤掉它们

    见:
    http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index
    http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_replace

    重构数据库
    我建议你改掉 CSV 的习惯,规范你的数据库。

    将值放入不同的行(每行一个值)并将monthyear列合并为一个,并添加一个名为idauto_increment integer primary key

    您的表格将如下所示:

    id    result    mydate
    1     15       2011-01-01
    2     13       2011-01-01
    3     -15      2011-01-01
    ...
    4875  -23      2011-08-28
    

    现在您可以通过以下方式添加特定月份的结果总和:

    $sql = "SELECT sum(result) as totalresult 
    FROM mytable
    WHERE mydate BETWEEN '$startdate' AND '$enddate' ";
    

    使用 between ... and 构造而不是函数 YEAR(mydate) and MONTH(mydate) 将允许 MySQL 使用索引来选择值。
    您将列包装在一个函数中 MySQL 不能使用索引,这会大大降低速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 2012-09-29
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多