我的列中有一串逗号分隔的数字。我想总结它们,以便将每个位置的每个单独的数字汇总在一起,并给我一个新的数字串。 (例如[1,2,3,4,5] + [6,7,8,9,0] = [7,9,11,13,5])。
要在mysql中执行此操作,我已在我的sql中定义了一个自定义函数SUMC,然后运行正常的SQL查询。当我在每组中有较少的行(5/6)时,这个工作正常。但是当我在一组中说1000行时,它只需要无限的时间。
有人可以建议我的代码有更好的方法或改进吗? (我在一个查询中总结了很多列。)
MYSQL QUERY:
SELECT col1, col2, SUM(num1), SUMC(GROUP_CONCAT(csv1),COUNT(csv1)) FROM `mytable` GROUP BY col1, col2
SUMC功能:
DELIMITER $$
CREATE FUNCTION SUMC(a TEXT, rop INT)
RETURNS TEXT
DETERMINISTIC
BEGIN
DECLARE vector,i,j,temp INT;
DECLARE fin TEXT;
SET fin = '';
SET i = 1;
SET j = 1;
SET temp = 0;
SET vector = CHAR_LENGTH(a) - CHAR_LENGTH(REPLACE(a, ',', ''));
SET vector = (vector+1)/rop;
myloop1: LOOP
myloop2: LOOP
SET temp = temp + SUBSTRING_INDEX(SUBSTRING_INDEX(a,',',(j-1)*vector+i),',',-1);
IF j = rop THEN
LEAVE myloop2;
END IF;
SET j = j+1;
END LOOP myloop2;
SET fin = CONCAT_WS(',',fin,temp);
SET temp = 0;
IF i = vector THEN
LEAVE myloop1;
END IF;
SET i = i+1;
SET j = 1;
END LOOP myloop1;
RETURN fin;
END
$$
SQL表:
col1 col2 num1 csv1
k1 K2 2 1,2,3
k1 K2 3 4,5,6
k1 K3 4 0,3,6
k1 K3 5 2,4,7
预期输出:
col1 col2 num1 csv1
k1 K2 5 5,7,9
k1 K3 9 2,7,13
P.S。 1:我当前的代码完美运行...唯一的问题是,当我在一个组中有很多行时,它会花费大量的时间(假设key1有2000行总和)
P.S。 1:在表格中,我有大约450个整数列(如Col1)和50个包含逗号分隔数字的文本列。
答案 0 :(得分:0)
注意,我实际上并不是在提倡任何类型的解决方案(我不会在SQL中使用非标准化环境)。这只是一件傻事......
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,strings VARCHAR(20) NOT NULL
);
INSERT INTO my_table (strings) VALUES ('1,2,3,4,5'),('6,7,8,9,0');
SELECT i
, GROUP_CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(strings,',',i),',',-1)) x
, SUM(SUBSTRING_INDEX(SUBSTRING_INDEX(strings,',',i),',',-1)) y
FROM my_table
, ints
WHERE i BETWEEN 1 AND LENGTH(strings)-LENGTH(REPLACE(strings,',',''))+1
GROUP
BY i;
+---+------+------+
| i | x | y |
+---+------+------+
| 1 | 1,6 | 7 |
| 2 | 2,7 | 9 |
| 3 | 8,3 | 11 |
| 4 | 4,9 | 13 |
| 5 | 5,0 | 5 |
+---+------+------+
(ints is a table of integers from 0-9)