Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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_Database_Substring - Fatal编程技术网

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), ';

我试图在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来获得结果,这样在每个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,但事实并非如此。使用子字符串设法解决这个问题:只要您能够对查询中的语言列表进行硬编码,就可以解决这个问题。