根据记录,MySQL Sum和Subtract?

时间:2011-08-28 21:30:22

标签: mysql row sum add

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

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

我想要做的就是在SQL查询中根据符号添加和减去这些值。

我知道SUM(),但减法怎么样?基本上,我需要一些可以在一个查询中执行的东西,如下例所示:

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

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

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

这是一个巨大的NONO,(我的)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' ";

我不是百分百肯定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列合并为一列,并添加名为auto_increment integer primary key的{​​{1}}列

您的表格如下所示:

id

现在,您可以通过执行以下操作添加特定月份的结果总和:

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将允许MySQL使用索引来选择值。
你在一个函数中包装一个列MySQL不能使用索引减慢很多东西。