我有下表:
+----+--------+------------+----------------------+
| ID | Name | To_Replace | Replaced |
+----+--------+------------+----------------------+
| 1 | Fruits | 1 | Fruits |
| 2 | Apple | 1-2 | Fruits-Apple |
| 3 | Citrus | 1-3 | Fruits-Citrus |
| 4 | Orange | 1-3-4 | Fruits-Citrus-Orange |
| 5 | Empire | 1-2-5 | Fruits-Apple-Empire |
| 6 | Fuji | 1-2-6 | Fruits-Apple-Fuji |
+----+--------+------------+----------------------+
如何创建列 Replaced
? 我想创建10个最大列(我知道嵌套级别不超过10个),并从每个被“-”拆分的子字符串中获取id,如果不是null,则将它们连接到 Replaced
,但我认为有一个更简单的解决办法。
2条答案
按热度按时间iyr7buue1#
您可以尝试以下方法:
退货
更新
确保聚合名称时保持id列表顺序。
退货
我确信这里可以进行优化,但是这个解决方案似乎可以保证保持列表顺序。
yhxst69z2#
虽然您所要求的在技术上是可行的(可能使用递归查询或计数),但我将采取不同的立场,建议您改为修复数据模型。
不应将多个值作为分隔列表存储在单个数据库列中。这违背了关系数据库的目的,使简单的事情变得不必要的复杂和低效。
相反,您应该有一个单独的表来存储这些数据,每个替换都需要存储这些数据
id
在一个单独的行上,也可能在一个列上,该列指示列表中每个元素的顺序。对于您的示例数据,如下所示:
现在您可以使用连接、子查询或横向连接高效地生成预期结果。假设您的表被调用
mytable
Map表是mymapping
,横向连接解决方案为: