Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-如何从字符串接收子字符串表_Mysql_Sql - Fatal编程技术网

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

MySQL-如何从字符串接收子字符串表,mysql,sql,Mysql,Sql,我在数据库中得到了一个表,表中有成对的EVENT_ID-varchar(300),其中包含以字符串形式连接的数据,这些数据来自重复属性和唯一用户名。 属性和名称之间的分隔符为“:”,并且“attribute:user”的每个集合都以“;”结尾,某些属性名称中有空格。每行中的对数未知 “attributeC:用户名称1;attributeA:用户名称3;attributeA:用户名称4;attributeA:用户名称10;attributeB:用户名称42;” 然后,我得到了成对的表USER\u

我在数据库中得到了一个表,表中有成对的EVENT_ID-varchar(300),其中包含以字符串形式连接的数据,这些数据来自重复属性和唯一用户名。 属性和名称之间的分隔符为“:”,并且“attribute:user”的每个集合都以“;”结尾,某些属性名称中有空格。每行中的对数未知

“attributeC:用户名称1;attributeA:用户名称3;attributeA:用户名称4;attributeA:用户名称10;attributeB:用户名称42;”

然后,我得到了成对的表USER\u ID-USER\u NAME,以及带有字段USER\u ID-EVENT\u ID-ATTRIBUTE的目标表


提取用户和属性并将其插入目标表的最佳方法是什么

我想在SQL(MySQL)中这样做,如果使用函数等,使它们成为临时的,脚本将只运行一次

如果这会非常复杂,我愿意将PHP与OOP mysqli函数结合使用。(它将在一组其他$mysqli->query()命令中运行)


我发现,子字符串(),LOCATE(),LENGTH()可能很方便

我能够通过PHP以某种费力的方式完成这项工作

  • 基于SELECT(用户ID-用户名称)生成数组
  • 进行SELECT(EVENT_ID-ATTENDANTS)并对每行调用explode(), 获取属性、事件ID、用户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;
    
    选择t.col,n.n,
    子串_索引(子串_索引(t.col,“;”,n.n),“;”,-1)成对,
    子字符串索引(子字符串索引(子字符串索引(t.col,;',n.n),;',1),,,:',1)作为名称,
    子字符串索引(子字符串索引(子字符串索引(t.col,;,,,,,,-1),,,,:,-1)作为值
    从t连接
    (选择1作为n联合所有选择2联合所有选择3
    )n
    
    关于长度(t.col)-length(replace(t.col,,;,,,))+1经过一些研究,我解决了它,它并不像看上去那样愚蠢

    代码优先:

    select OUTPUT.ID, OUTPUT.name, OUTPUT.attribute from
    (
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 1), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 1), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 2), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 2), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 3), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 3), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 4), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';',4), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 5), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 5), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 6), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 6), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 7), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 7), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 8), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 8), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 9), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 9), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 10), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 10), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 11), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 11), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 12), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 12), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 13), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 13), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 14), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 14), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 15), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 15), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 16), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 16), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 17), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 17), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 18), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 18), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 19), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 19), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 20), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 20), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 21), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 21), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 22), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 22), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 23), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 23), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 24), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 24), ';', -1), ':', -1) as name
    from AKCE
    
    union
    
    select
      AKCE.ID,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 25), ';', -1), ':', 1) as attribute,
      substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 25), ';', -1), ':', -1) as name
    from AKCE
    
    order by ID
    ) AS OUTPUT WHERE OUTPUT.name!='' AND OUTPUT.attribute!=''
    
    如您所见,它很长,充满了冗余代码等

    当您使用子字符串_index()且其位置大于其中的deimiter数时,它将返回空字段。由于联合,这些空字段仅在每个原始表行(AKCE.ID)中返回一次

    这些空行将使用WHERE…!=''进行筛选



    这当然不是正确的方法,但在最多23对的150行上,它工作得非常好,而且速度非常快(只比该表上的基本选择慢10倍)

    我想:t.col=my_table.ATTENDANTS,n=重复次数,n.n到底是什么?我必须补充一点,对的数量是未知的,很可能每个事件行都不同。@Faramos…on
    子句应该处理这个问题。您只需要
    n
    的值就可以得到每一对。