mysql选择子字符串并按列分组

时间:2014-01-18 13:55:04

标签: 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), ';', -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:等。

任何一个遇到类似的问题,并知道解决它的方法吗?

3 个答案:

答案 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