我正在尝试将数据划分到我的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), ';', -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)得到结果,因此在每个列中都存在一种类型的translatoin。例如,在column1 = pl:,column2 = en:等。
任何一个遇到类似的问题,并知道解决它的方法吗?
答案 0 :(得分:0)
您需要取消数据的转换,然后选择每个值的第一部分和第二部分,然后重新聚合。
然而,更好的数据形式实际上是语言/翻译。以下产生了这个:
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”列来标识每一行,而不是name
列。
您现在可以将此结果透视以获得所需内容:
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;
答案 1 :(得分:0)
通过使用一些与字符串相关的函数函数来解决它:
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
感谢大家的帮助。
答案 2 :(得分:-1)
据我了解,您希望对您的数据进行UNPIVOT。 MySQL中没有这样的功能,因此您可能希望将数据导出到MSSQL(可以使用免费的MSSQL Express)并使用UNPIVOT函数:http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx