我在我的数据库中得到了一对 EVENT_ID - ATTENDANTS varchar(300) 表,其中包含由重复属性和唯一用户名连接而成的字符串形式的数据。 属性和名称之间的分隔符是“:”并且“属性:用户”的每个集合都以“;”结尾某些属性名称中有空格。每行中的对数未知。
“attributeC:user_name1;attributeA:user_name3;attributeA:user_name4;attributeA:user_name10;attributeB:user_name42;”
然后我得到了包含 USER_ID - USER_NAME 对的表和包含字段 USER_ID - EVENT_ID - ATTRIBUTE 的目标表。
提取用户和属性并将它们插入目标表的最佳方法是什么?
我很乐意在 SQL (MySQL) 中执行此操作,以防使用函数等,使它们成为临时的,脚本将只运行一次。
如果它过于复杂,我愿意将 PHP 与 OOP mysqli 函数结合使用。 (它将在一组其他 $mysqli->query() 命令中运行)
我发现,MySQL functions SUBSTRING()、LOCATE()、LENGTH() 可以派上用场。
我可以通过 PHP 以一些费力的方式完成此操作
- 根据 SELECT(USER_ID - USER_NAME) 创建数组
- 进行 SELECT(EVENT_ID - ATTENDANTS) 并对每一行调用 explode(), 获取属性、EVENT_ID、USER_ID(来自上面的数组,而不是 SQL 查询每个事件的每个字符串中的每个用户名)
- 使用准备好的 mysqli 并行插入数据到目标表 声明
但我认为(希望?)有更好的方法。你怎么看?
最佳答案
您可以在 MySQL 中相当痛苦地完成此操作。这是获取前三个这样的字符串的示例:
select t.col, n.n,
substring_index(substring_index(t.col, ';', n.n), ';', -1) as pair,
substring_index(substring_index(substring_index(t.col, ';', n.n), ';', -1), ':', 1) as name,
substring_index(substring_index(substring_index(t.col, ';', n.n), ';', -1), ':', -1) as value
from t join
(select 1 as n union all select 2 union all select 3
) n
on length(t.col) - length(replace(t.col, ';', '') + 1 <= n.n;
您只需将额外的数字添加到 n
子查询中即可获得更多对。
关于MySQL - 如何从字符串中接收子字符串表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38185046/