【发布时间】:2012-04-14 13:35:09
【问题描述】:
我有一个表 col1 id int,col2 作为 varchar(逗号分隔值)和第 3 列用于为它们分配组。 表格看起来像
col1 col2 group
..............................
1 2,3,4
2 5,6
3 1,2,5
4 7,8
5 11,3
6 22,8
这只是真实数据的样本,现在我必须为它们分配一个组号,以便输出看起来像
col1 col2 group
..............................
1 2,3,4 1
2 5,6 1
3 1,2,5 1
4 7,8 2
5 11,3 1
6 22,8 2
分配组号的逻辑是 col2 中字符串的每个相似的逗号分隔值必须与 col2 中的每个位置相同的组号 '2' 那里它必须是相同的组号,但复杂的是 2 ,3,4 在一起,因此如果在 col2 中的任何位置找到它们所有三个 int 值,它们将被分配到同一组。 主要部分是 col2 中的 2,3,4 和 1,2,5 都有 2 所以所有 int 1,2,3,4,5 都必须分配相同的组号。 尝试了与 col2 匹配的存储过程,但没有得到想要的结果
大多数小鬼(我不能使用规范化,因为我负担不起从拥有数百万条记录的原始表中创建新表),即使规范化在我的上下文中也没有帮助。
目前为止...... 我已经设置了组列自动增量,然后编写了这个程序:-
BEGIN
declare cil1_new,col2_new,group_new int;
declare done tinyint default 0;
declare group_new varchar(100);
declare cur1 cursor for select col1,col2,`group` from company ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
open cur1;
REPEAT
fetch cur1 into col1_new,col2_new,group_new;
update company set group=group_new where
match(col2) against(concat("'",col2_new,"'"));
until done end repeat;
close cur1;
select * from company;
END
这个程序正在运行,没有语法错误,但问题是我没有完全达到预期的结果。
【问题讨论】:
-
您会接受将您的 CSV 列标准化为另一个表的解决方案吗?
-
在关系数据库中存储 CSV 就像用自行车拖车一样。
-
不,因为真正的表在 gb 中太大了,所以我无法对其进行规范化。
-
很抱歉,构建一个满足您要求的解决方案需要更多时间,我想花在上面的时间。我认为how to split CSV values into seperate values 上的这个链接会让你开始。祝你好运!
-
我很确定您将花费更多的资源来维护 csv 值而不是规范化数据,此外,仅存储 csv 会比规范化结构提供更差的性能。
标签: mysql stored-procedures csv match-against