MySQL - 如何从字符串中接收子字符串表

标签 mysql sql

我在我的数据库中得到了一对 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 以一些费力的方式完成此操作

  1. 根据 SELECT(USER_ID - USER_NAME) 创建数组
  2. 进行 SELECT(EVENT_ID - ATTENDANTS) 并对每一行调用 explode(), 获取属性、EVENT_ID、USER_ID(来自上面的数组,而不是 SQL 查询每个事件的每个字符串中的每个用户名)
  3. 使用准备好的 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/

相关文章:

同一查询中的 MySQL Sum 和 Group By

mysql - mysql中"Read Only Database"vs "Read and Write database"配置

php - 无法让简单(无加密)php忘记密码表单工作

mysql - 如何向 mySQL 中已存在的表添加约束?

mysql - SQL 将 "co-efficients"分配给查询条件并使用它们对结果进行排序

sql - 只有特定列的第一行具有相同的值

mysql - 在 mysql 查询中按条件分组

php - 类别和子类别表结构 - mysql

SQL:如何在忽略时间的情况下比较日期?

mysql - 计算新插入的到期日期