mysql选择子字符串并按列将其分组
我试图在MySQL数据库的一个表中划分数据 列包含如下数据:mysql选择子字符串并按列将其分组,mysql,sql,database,substring,Mysql,Sql,Database,Substring,我试图在MySQL数据库的一个表中划分数据 列包含如下数据: de:"Sweatjacke*";en:"jacket*";pl:"bluza*"; de:"*";en:"*";pl:"bluza*"; fr:"*";de:"*";en:"*";pl:"dres junior*";cz:"*"; pl:"bluza"; 我试着把所有的翻译分成不同的栏目。已提供解决方案,可通过使用: SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(name, ';', 1), ';
de:"Sweatjacke*";en:"jacket*";pl:"bluza*";
de:"*";en:"*";pl:"bluza*";
fr:"*";de:"*";en:"*";pl:"dres junior*";cz:"*";
pl:"bluza";
我试着把所有的翻译分成不同的栏目。已提供解决方案,可通过使用:
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ';', 1), ';', -1) as tr1,
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ';', 2), ';', -1) as tr2,
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ';', 3), ';', -1) as tr3,
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ';', 4), ';', -1) as tr4,
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ';', 5), ';', -1) as tr5
FROM product;
声明,但结果是:
tr1 tr2 tr3 tr4 tr5
fr:"*" de:"*" en:"*" pl:"bluza*" cz:"*"
fr:"*" de:"Sweatjacke*" en:"jacket*" pl:"bluza*" cz:"*"
de:"Sweatjacke*" en:"jacket*" pl:"bluza*"
我想通过翻译类型pl/de/en来获得结果,这样在每个collumn中都有一种类型的translatoin。例如,在column1=pl:,column2=en:etc中
有没有人遇到过类似的问题,并且知道如何解决它?据我所知,您希望取消归档数据。MySQL中没有这样的函数,因此您可能希望将数据导出到MSSQL。您可以使用免费的MSSQL Express并使用UNPIVOT函数:您需要取消pivot数据,然后选择每个值的第一部分和第二部分,然后重新聚合它 然而,数据的更好形式是真正有语言/翻译。以下是产生这种情况的原因:
select substring_index(tr, ':', 1) as l, substring_index(tr, ':', 2) as t, name
from (select SUBSTRING_INDEX(SUBSTRING_INDEX(name, ';', n.n), ';', -1) as tr, n, name
from product p cross join
(select 1 as n union all select 2 union all select 3 union all select 4 union all
select 5
) n
) n
您可能需要id列或word列来标识每一行,而不是名称列
现在,您可以旋转此结果以获得所需内容:
select max(case when l = 'en' then name end) as en,
max(case when l = 'fr' then name end) as fr,
max(case when l = 'de' then name end) as de,
max(case when l = 'pl' then name end) as pl,
max(case when l = 'cz' then name end) as cz
from (select substring_index(tr, ':', 1) as l, substring_index(tr, ':', 2) as t, name
from (select SUBSTRING_INDEX(SUBSTRING_INDEX(name, ';', n.n), ';', -1) as tr, n, name
from product p cross join
(select 1 as n union all select 2 union all select 3 union all select 4 union all
select 5
) n
) n
) lt
group by name;
通过使用一些与字符串相关的函数函数解决了此问题:
SELECT
SUBSTRING_INDEX( SUBSTRING( name, LOCATE( "pl:", name ) , 150 ) , ';', 1 ) AS pl,
SUBSTRING_INDEX( SUBSTRING( name, LOCATE( "en:", name ) , 150 ) , ';', 1 ) AS en,
SUBSTRING_INDEX( SUBSTRING( name, LOCATE( "de:", name ) , 150 ) , ';', 1 ) AS de,
SUBSTRING_INDEX( SUBSTRING( name, LOCATE( "fr:", name ) , 150 ) , ';', 1 ) AS fr
FROM product
感谢大家的帮助。这样做的困难就是为什么你不应该使用这种桌子设计。您需要了解数据库规范化。请告诉创建此表设计的人;-我想如果你在互联网上搜索,你可以找到一些使用regexp进行子字符串提取的UDF。使用普通的MySQL函数没有简单的方法。选择子字符串_INDEX子字符串name,找到pl:,name,150,“;”,1作为pl,子字符串_索引子字符串名称,定位en:,名称,150';',1作为en,子字符串_索引子字符串名称,定位de:,名称,150';',1作为de,子字符串_索引子字符串名称,定位fr:,名称,150';',1由于产品的fr完成了工作;-谢谢Thx iForm,但它与旋转/取消旋转无关。我想拆分这些列。但不只是用“;”来分割它分隔符,但也将数据分配到正确的列中。谢谢Gordon,但事实并非如此。使用子字符串设法解决这个问题:只要您能够对查询中的语言列表进行硬编码,就可以解决这个问题。