2011-08-28 46 views
0

我有MySQL中的記錄包含這樣的事情:MySQL的總和和減去根據記錄?

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

所有我想要做的是,在一個SQL查詢這些值獲得根據自己的招牌相加和相減。

我知道SUM(),但減法呢?基本上,我需要一個可以在一個查詢中執行的操作,如下例所示:

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

查詢出了什麼問題? –

+0

它沒有迴應...但我嘗試了不同的語法,這一次,它的工作:/ – Ahsan

+0

請注意,'年'和'月'是保留字,需要引號反引號'爲了工作。 – Johan

回答

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

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' "; 

我不是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列合併成一個,並添加一個名爲auto_increment integer primary keyid

您的表看起來類似:

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不能使用索引減慢了很多事情。