使用mysql在另一个字段中进行split和sum的数据库更新查询

时间:2014-03-21 07:19:49

标签: mysql sql

我有一张桌子

test
ID       text       sum
-----------------------
1        1_2_3         0 

2        2_3_4_5       0

我想将此表更新为

ID       text       sum
------------------------
1        1_2_3        6

2        2_3_4_5      14

如何编写查询或函数/过程。

3 个答案:

答案 0 :(得分:1)

你应该真正标准化你的数据,但假设你被迫使用它:

UPDATE tableName SET sum=SUBSTRING_INDEX(text,'_',1) +
 SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(text,'_0'),'_',2),'_',-1) +
 SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(text,'_0'),'_',3),'_',-1) +
 SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(text,'_0'),'_',4),'_',-1) +
 SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(text,'_0'),'_',5),'_',-1);

使用SUBSTRING _INDEX隔离每个数字,如果表达式的数量大于值的数量,则使用CONCAT给出0。

The fiddle

答案 1 :(得分:1)

尝试使用此解决方案...... 希望这会对你有帮助....

SELECT SUM(Trim( Left(Name, InStr(Name, "_") - 1)) + 
           Trim(  Mid(Name, InStr(Name, "_") + 1)) + 
           Trim(Right(Name, InStr(Name, ",") + 1))) as SUM FROM TEST;

表结构如下:

   Id |  Name     |
   1  | 1_2_3     |
   2  | 5_8_10    |

结果为

SUM
 6
23

答案 2 :(得分:1)

解决此问题的最佳方法是使每个文本字段成为SQL语句。

首先,这是样本数据

mysql> drop table if exists prabhu;
Query OK, 0 rows affected (0.27 sec)

mysql> create table prabhu
    -> (
    ->   id int not null auto_increment primary key,
    ->   text varchar(128),
    ->   sum int default 0
    -> );
Query OK, 0 rows affected (0.56 sec)

mysql> insert into prabhu (text) values ('1_2_3'),('2_3_4_5');
Query OK, 2 rows affected (0.09 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from prabhu;
+----+---------+------+
| id | text    | sum  |
+----+---------+------+
|  1 | 1_2_3   |    0 |
|  2 | 2_3_4_5 |    0 |
+----+---------+------+
2 rows in set (0.00 sec)

mysql>

这是一个查询,使每行产生一个SQL语句来更新sum

mysql> SELECT CONCAT('UPDATE prabhu SET sum=',
    -> REPLACE(text,'_','+'),' WHERE id=',id,';') sqlstmt FROM prabhu;
+-------------------------------------------+
| sqlstmt                                   |
+-------------------------------------------+
| UPDATE prabhu SET sum=1+2+3 WHERE id=1;   |
| UPDATE prabhu SET sum=2+3+4+5 WHERE id=2; |
+-------------------------------------------+
2 rows in set (0.00 sec)

mysql>

现在,将查询的输出反馈回mysql并执行每一行

C:\>mysql -Dtest -ANe"SELECT CONCAT('UPDATE prabhu SET sum=',REPLACE(text,'_','+'),' WHERE id=',id,';') sqlstmt FROM pra
bhu" | mysql -Dtest

C:\>mysql -Dtest -Ae"SELECT * FROM prabhu"
+----+---------+------+
| id | text    | sum  |
+----+---------+------+
|  1 | 1_2_3   |    6 |
|  2 | 2_3_4_5 |   14 |
+----+---------+------+

C:\>

试一试!!!