我在mysql中有一条记录,其中包含以下内容:
+15,+23,-21,+23,-3
我想要做的就是在SQL查询中根据符号添加和减去这些值。
我知道SUM()
,但减法怎么样?基本上,我需要一些可以在一个查询中执行的东西,如下例所示:
SELECT SUM(result) AS 'total' FROM mytable WHERE year='2011' AND month='10';
答案 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习惯并规范化数据库。
将值放入不同的行(每行一个值)并将month
和year
列合并为一列,并添加名为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不能使用索引减慢很多东西。