MySQL-如何从字符串接收子字符串表
我在数据库中得到了一个表,表中有成对的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的目标表MySQL-如何从字符串接收子字符串表,mysql,sql,Mysql,Sql,我在数据库中得到了一个表,表中有成对的EVENT_ID-varchar(300),其中包含以字符串形式连接的数据,这些数据来自重复属性和唯一用户名。 属性和名称之间的分隔符为“:”,并且“attribute:user”的每个集合都以“;”结尾,某些属性名称中有空格。每行中的对数未知 “attributeC:用户名称1;attributeA:用户名称3;attributeA:用户名称4;attributeA:用户名称10;attributeB:用户名称42;” 然后,我得到了成对的表USER\u
提取用户和属性并将其插入目标表的最佳方法是什么 我想在SQL(MySQL)中这样做,如果使用函数等,使它们成为临时的,脚本将只运行一次 如果这会非常复杂,我愿意将PHP与OOP mysqli函数结合使用。(它将在一组其他$mysqli->query()命令中运行)
我发现,子字符串(),LOCATE(),LENGTH()可能很方便 我能够通过PHP以某种费力的方式完成这项工作
但我认为(希望?)有更好的办法。你觉得怎么样?在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
的值就可以得到每一对。