Вы используете разделенное запятыми поле в вашей базе данных.
Это огромное НЕ, (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Привычка и нормализация вашей базы данных.
Поместите значения в разные строки (по одному значению в строке), объедините столбцы 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 не может использоватьИндекс N сильно замедляет работу.