Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: нахождение суммы чисел в поле со строкой

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: парсинг и обработка значения
Panoptik
Отправлено: 27 Декабря, 2011 - 19:05:57
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




усем приветы.

есть поле varchar в таблице, и в нем записаны числа через запятую, например
2,2,1
1
1,3
5,2

задача стоит в нахождении суммы всех этих чисел
например чтобы результат хранился в отдельном поле
5
1
4
7

возможно ли такое проделать в mysql? из всех вариантов находил только с помощью хранимых процедур, с коими дела не имел, но если они могут принести результат, то можно воспользоваться и этим.
буду благодарен за релизацию решения


-----
Just do it
 
 Top
OrmaJever Модератор
Отправлено: 27 Декабря, 2011 - 19:13:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




к примеру
PHP:
скопировать код в буфер обмена
  1. $arr = explode(',', $row['number']); // делим и записываем в масив
  2.  
  3. for($i=1;$i<sizeof($arr);++$i) { // начиная со 2 числа и до конца
  4.    $arr[0] += $arr[$i]; // плюсуем все к первому числу.
  5. }
  6. echo $arr[0];


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Panoptik
Отправлено: 27 Декабря, 2011 - 19:14:34
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




решение нужно сугубо на sql . ибо полученный результат нужно еще будет сортировать...


-----
Just do it
 
 Top
tuareg
Отправлено: 27 Декабря, 2011 - 19:20:59
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Вот аналог функции EXPLODE в MySQL через процедуру
http://vexell[dot]ru/2010/10/mysql-implode-explode/
 
 Top
Panoptik
Отправлено: 27 Декабря, 2011 - 19:30:24
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




самое интересное что эту ссылку я сегодня тоже находил, но так как с хранимками не работал, то неного есть неясностей
CODE (SQL):
скопировать код в буфер обмена
  1. DELIMITER //
  2. CREATE PROCEDURE `explode`(IN `mylist` VARCHAR(255))
  3. body:
  4. BEGIN
  5.   IF mylist = '' THEN LEAVE body; END IF;
  6.  
  7.   SET @saTail = mylist;
  8.  
  9.   WHILE @saTail != '' DO
  10.     SET @sHead = SUBSTRING_INDEX(@saTail, ',', 1);
  11.     SET @saTail = SUBSTRING( @saTail, LENGTH(@sHead) + 2 );
  12.     ## Тут любой Ваш код
  13.     ## Для примера добавление новых ID пользователей в таблицу users
  14.     INSERT INTO users (id) VALUES (@sHead);
  15.   END WHILE;
  16.  
  17. END//
  18. DELIMITER ;


я понимаю 50% этого кода, но вот операция инсерт мне ни к чему. как бы ее заменить чтобы просто я вызвал эту процедуру и получил поле в таблице с суммой, например
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *, call explode(`row_count`) AS `total_count` FROM `my_table` ORDER BY `total_count`


-----
Just do it
 
 Top
tuareg
Отправлено: 27 Декабря, 2011 - 19:36:13
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. DELIMITER //
  3. CREATE PROCEDURE `explode`(IN `mylist` VARCHAR(255))
  4. body:
  5. BEGIN
  6.   IF mylist = '' THEN LEAVE body; END IF;
  7.  
  8.   SET @saTail = mylist,@countNum = 0;/*Добавляем еще одну переменную*/
  9.  
  10.   WHILE @saTail != '' DO
  11.     SET @sHead = SUBSTRING_INDEX(@saTail, ',', 1);
  12.     SET @saTail = SUBSTRING( @saTail, LENGTH(@sHead) + 2 );
  13.     SET @countNum= @countNum+@sHead;/*Производим сложение*/
  14.   END WHILE;
  15.   SELECT @countNum; /*Выводим ее*/
  16. END//
  17. DELIMITER ;
  18.  
 
 Top
armancho7777777 Супермодератор
Отправлено: 27 Декабря, 2011 - 19:38:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




OrmaJever пишет:
к примеру
PHP:
скопировать код в буфер обмена
  1. $arr = explode(',', $row['number']); // делим и записываем в масив
  2.  
  3. for($i=1;$i<sizeof($arr);++$i) { // начиная со 2 числа и до конца
  4.    $arr[0] += $arr[$i]; // плюсуем все к первому числу.
  5. }
  6. echo $arr[0];


Ну Вы даёте даёте OrmaJever))

PHP:
скопировать код в буфер обмена
  1.  
  2.  // Не мешалобы для начала возможные пробелы удалить
  3. $number = str_replace(' ', '', $row['number']);
  4.  
  5. // Формируем массив
  6. $arr = explode(',', $number);
  7.  
  8.  // Вычисляем сумму всех элементов массива
  9. $s = array_sum($arr);
  10.  
  11. echo $s;
  12.  

(Отредактировано автором: 27 Декабря, 2011 - 19:42:55)

 
 Top
Panoptik
Отправлено: 27 Декабря, 2011 - 19:39:26
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




спасибы! щас протестируем. я надеюсь использование я правильно делаю:
call explode(`row_count`) , где row_count столбец со строковыми данными?


-----
Just do it
 
 Top
Champion Супермодератор
Отправлено: 27 Декабря, 2011 - 19:41:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




А какая СУБД? И с чего такая потребность?
 
 Top
Panoptik
Отправлено: 27 Декабря, 2011 - 19:42:48
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




mysql. формирование отчетных данных с возможностью сортировки по различным параметрам


-----
Just do it
 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Декабря, 2011 - 19:44:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Ээээ... А так:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT f1,f2,f3,(f1+f2+f3) fsum FROM tbl

???
 
 Top
tuareg
Отправлено: 27 Декабря, 2011 - 19:45:35
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




А если вам вообще в запросе, то нужна ф-я а не процедура.
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. DELIMITER //
  3. CREATE FUNCTION `explode`(`mylist` char(50)) RETURNS int(11)
  4. BEGIN
  5.  DECLARE returnCount int(3);
  6.  IF mylist = '' THEN LEAVE body; END IF;
  7.  SET @saTail = mylist;/*Добавляем еще одну переменную*/
  8.  WHILE @saTail != '' DO
  9.     SET @sHead = SUBSTRING_INDEX(@saTail, ',', 1);
  10.     SET @saTail = SUBSTRING( @saTail, LENGTH(@sHead) + 2 );
  11.     SET returnCount= returnCount+@sHead;/*Производим сложение*/
  12.   END WHILE;
  13.  RETURN returnCount;
  14. END//
  15. DELIMITER ;
  16. /*И тогда запрос*/
  17. SELECT *, `explode`(`row_count`) AS `total_count` FROM `my_table` ORDER BY `total_count`
  18.  

Вот как-то так. Писал прямо тут, так что не обессудьте.
 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Декабря, 2011 - 19:47:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




А я чот не то написал..
 
 Top
Panoptik
Отправлено: 27 Декабря, 2011 - 19:54:27
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




tuareg большое спасибо вам за исчерпывающий ответ. плюсую
(Добавление)
кстати вот эти DELIMETR это обязательные вещи? и нужно ли каждый раз выполнять функцию, или один раз выполнить, а после она будет храниться?


-----
Just do it
 
 Top
tuareg
Отправлено: 27 Декабря, 2011 - 20:09:00
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Panoptik пишет:
DELIMETR это обязательные вещи?

Да это разделители. Т.е они необходимы, для того чтобы можно было использовать ;
в функции или в процедуре.
Panoptik пишет:
и нужно ли каждый раз выполнять функцию, или один раз выполнить, а после она будет храниться?

Нет, ее достаточно создать один раз и все. Потом она уже будет выполняться сама.
хранятся они в таблице 'information_schema'.(по моему Улыбка ).
Плюсом использования в данном случае функции, является то, что она после первого запроса в соединении попадет в КЭШ mySQL.(план выполнения ф-и) И далее затраты на ее выполнение будут мизерны.
P.S Единственное, что я бы сделал, это не сортировал на стороне MySQl, а сортировку производил уже на PHP. Потому что в данном запросе, будет осуществляться полное сканирование таблицы, потом создание временной таблицы, ее сортировка и только потом вывод рез-та.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB