MySQL сумма и вычитать в соответствии с записями? - PullRequest
0 голосов
/ 29 августа 2011

У меня есть запись в MySQL, которая содержит что-то вроде этого:

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

Все, что я хочу сделать, - это чтобы в SQL-запросе эти значения складывались и вычитались в соответствии с их знаками.

Я знаю о SUM(), но как насчет вычитания? По сути, мне нужно что-то, что может быть выполнено в одном запросе, как в следующем примере:

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

Ответы [ 2 ]

1 голос
/ 29 августа 2011

Ваш запрос будет работать правильно.Протестировано на

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 голосов
/ 29 августа 2011

Вы используете разделенное запятыми поле в вашей базе данных.

Это огромное НЕ, (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 сильно замедляет работу.

...