有几个解决方案可以做到这一点,但我的情况有点不同。
例如,
数据样本
表:数据
suid(bigint), start(bigint), end(bigint), route(text)
123, 111, 112, '1111, 1112, 1113, 1114'
123, 114, 115, '2221, 2222, 2223'
133, 121, 122, '331, 332, 333'
预期结果:
需要创建一个表:newdata
suid(bigint), start(bigint), end(bigint), road_seg1(int), road_seg2(int)
123, 111, 112, 1111, 1112
123, 111, 112, 1112, 1113
123, 111, 112, 1113, 1114
123, 114, 115, 2221, 2222
123, 114, 115, 2222, 2223
133, 121, 122, 331, 332
133, 121, 122, 332, 333
所以我需要{route,second},{second,third},{third,4th} ..... from route(text)
路线(文字)物品最多可以包含100件物品,但物品总数是随机的
任何帮助将不胜感激。我正在使用MySql。
感谢。
答案 0 :(得分:1)
如果存在有限数量的此类联结,您可以使用相当复杂的查询来执行此操作:
select d.suid, s.start, s.end,
substring(substring_index(route, ', ', n.n), ', ', -1) as road_seg1,
substring(substring_index(route, ', ', n.n+1), ', ', -1) as road_seg2
from data d cross join
(select 1 as n union all select 2 union all select 3
) n
where length(replace(route, ', ', ', x')) - length(route) <= n.n;
对substring_index()
的嵌套调用正在从字符串中提取第n和第n + 1项。查询所查找的项目总数由子查询n
定义(在本例中为3,但您可以添加更多值)。 where
子句选择n
的值小于列表中的项目数。
答案 1 :(得分:0)
为了完整性,这里是我建议用于转换输入数据的awk
程序:
BEGIN
{FS=","; OFS=","}
{
gsub(/'/,"");
for(i=4;i<=NF-1;i++){
print $1,$2,$3,$i,$(i+1) ;
};
}
在测试数据上提供此输出:
123, 111, 112, 1111, 1112 123, 111, 112, 1112, 1113 123, 111, 112, 1113, 1114 123, 114, 115, 2221, 2222 123, 114, 115, 2222, 2223 133, 121, 122, 331, 332 133, 121, 122, 332, 333