我有MySQL中的記錄包含這樣的事情:MySQL的總和和減去根據記錄?
+15,+23,-21,+23,-3
所有我想要做的是,在一個SQL查詢這些值獲得根據自己的招牌相加和相減。
我知道SUM()
,但減法呢?基本上,我需要一個可以在一個查詢中執行的操作,如下例所示:
SELECT SUM(result) AS 'total' FROM mytable WHERE year='2011' AND month='10';
我有MySQL中的記錄包含這樣的事情:MySQL的總和和減去根據記錄?
+15,+23,-21,+23,-3
所有我想要做的是,在一個SQL查詢這些值獲得根據自己的招牌相加和相減。
我知道SUM()
,但減法呢?基本上,我需要一個可以在一個查詢中執行的操作,如下例所示:
SELECT SUM(result) AS 'total' FROM mytable WHERE year='2011' AND month='10';
您的查詢將正常工作。測試在
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
你在你的數據庫中使用逗號分隔場。
這是一個巨大的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' ";
我不是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的習慣和規範你的數據庫。
把值代入不同的行(每行一個值)和month
和year
列合併成一個,並添加一個名爲auto_increment integer primary key
列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
構造函數而不是函數YEAR(mydate) and MONTH(mydate)
將允許MySQL使用索引來選擇值。
你在一個函數中包裝一列MySQL不能使用索引減慢了很多事情。
查詢出了什麼問題? –
它沒有迴應...但我嘗試了不同的語法,這一次,它的工作:/ – Ahsan
請注意,'年'和'月'是保留字,需要引號反引號'爲了工作。 – Johan