链接两个包含管道分隔字符的MySQL表是唯一的物理链接,这是相对位置

Linking two MySQL tables containing pipe delimited characters were the only physical link is there relative location

提问人:A.Steer 提问时间:12/14/2022 最后编辑:danronmoonA.Steer 更新时间:12/19/2022 访问量:45

问:

我有两个MYSQL表,产品和价格这两个表都是通过 Web 表单填充的,该表单为最终用户选择的选项创建以管道分隔的值。此过程和初始输出无法更改。

因此,如果 User1 选择 3 个产品,他们将有一个包含 3 个产品和 2 个管道的字符串。如果用户 2 选择 7 个产品,他们将有一个包含 7 个产品和 6 个管道的字符串。

然后,单独的价格表将为用户选择的每个项目的价格提供相应的管道分隔值。

我想将价格归因于产品,但唯一的链接值是管道分隔字符串中的位置,其长度根据所选项目的数量而波动。

产品表

帐户 ID 选项
S001型 猫|狗|奶牛|羊
S002型 猫|狗|奶牛|羊
S003型 猫|狗|羊
S004型 猫|狗|羊
S005型 猫|狗|羊
S006型 猫|狗|奶牛|羊
S007系列 猫|狗|奶牛|猪|山羊|海鸥|羊
S008型
S009型 猪|山羊|海鸥|羊
S010系列 猫|狗|奶牛|绵羊|密封

价格表

帐户 ID 选项折扣
S001型 -40.00|0.00|-40.00|0.00
S002型 -40.00|0.00|-40.00|0.00
S003型 -40.00|0.00|0.00
S004型 -5.50|0.00|0.00
S005型 -40.00|0.00|0.00
S006型 -40.00|0.00|0.00
S007系列 -15.00|0.00|-15.00|-15.00|0.00|-15.00|0.00
S008型 -13.85
S009型 -33.71|0.00|-33.71|0.00
S010系列 -40.00|0.00|-40.00|0.00

因此,使用上面的表格,我需要说:

  • s001,Cat 为 -40,Cow 为 -40
  • s005,绵羊(位置 3)为 0.00
  • s006,绵羊(位置 4)为 0.00
  • s008,鸭子是-13.85

对于每个帐户,每个产品的位置可以位于不同的位置,如 S001、S005、S007 的绵羊产品所示,它分别出现在位置 4、3 和 7。

目前有 13 种单独的“动物”产品可供用户选择,目前在数据库中,存在大约 50 种产品字符串变体。

目前,我需要根据此标准报告大约 2,500 行记录,但 DB 表包含大约 190 万条记录(其余记录具有我可以处理的一致性级别),其余 2,500 行具有奇怪的格式。

使用 MySQL 中的substring_index,我可以根据分隔符拆分字符串,然后为每个单独的数据项提供一列:

产品

    case when 0<= LENGTH(options) - LENGTH(REPLACE(options, '|', '')) then
 SUBSTRING_INDEX(SUBSTRING_INDEX(options, '|', 1), '|', -1) ELSE null  end as op1
帐户 ID OP1 OP2 OP3 OP4
S001型

我还可以在价格表上执行相同的功能,然后将每个数据项作为单独的列提供。

我遇到的问题是我无法根据其位置将价格项目归因于产品项目的描述

我确实可以选择使用 SSIS 对数据进行转换,如果该语言的选项可用,我还可以将数据保存到 SQL 服务器数据库。

子字符串 比较 mysql-5.1

评论

2赞 RiggsFolly 12/14/2022
恐怕是一个重大的设计错误。将数据库设计为关系数据库,这些问题将不再困扰您。读取 在数据库列中存储带分隔符的列表真的有那么糟糕吗?TL/DR
0赞 RiggsFolly 12/14/2022
存储零折扣似乎没有多大意义。说我能不能找到折扣用它不是更好,否则折扣为零
2赞 RiggsFolly 12/14/2022
我很抱歉,但是,无论谁设计了这个数据库(如果是这个词的话),都给你留下了一个完全和彻底的混乱。
0赞 Paul T. 12/14/2022
如果你能以某种方式将其转换为独特的(帐户、动物)列,并带有第三列价格,我会以这种方式开始。正如在之前的评论中提到的,出于同样的原因,我不会有任何 0 折扣的条目。
1赞 Bill Karwin 12/15/2022
您是否希望我发布我的 MySQL 8.0 解决方案作为答案,知道它在 MySQL 5.1 中不起作用?它至少可以为您提供有关如何在 SQL Server 中解决该问题的想法。

答: 暂无答案