2013-04-23 54 views
1

我用下面的动态SQL脚本将表转换像
如何在动态SQL脚本中使用稀疏列

(1,ATTRIBUTENAME1,Attributevalue1)
(1,ATTRIBUTENAME2,Attributevalue2)
(2,AttributeName1,Attributevalue1)
(2,AttributeName2,Attributevalue2)



(11113,ATTRIBUTENAME2,Attributevalue2)

到一个表到下面格式

(数据点,ATTRIBUTENAME1,ATTRIBUTENAME2,............. AttributeNamen )
(1,AttributeValue1,AttributeValue2,.........................)
(2,AttributeValue1,AttributeValue2,..... ....................)



(11113,AttributeValue1,AttributeValue2,.........................)

======== ======动态SQL脚本================

SET @sql = NULL;<br/> 
SELECT<br/> 
    GROUP_CONCAT(DISTINCT<br/> 
    CONCAT(<br/> 
     'max(CASE WHEN AttributeName = ''',<br/> 
     AttributeName,<br/> 
     ''' THEN AttributeValue END) AS `', 
     AttributeName, '`'<br/> 
    )<br/> 
) INTO @sql<br/> 
FROM yourtable;<br/> 
<br/> 

SET @sql <br/> 
    = CONCAT('SELECT datapoint, ', @sql, ' <br/> 
      from yourtable<br/> 
      group by datapoint');<br/> 

PREPARE stmt FROM @sql;<br/> 
EXECUTE stmt;<br/> 
DEALLOCATE PREPARE stmt;<br/> 

问题:我跑出来的列数SQL的limit.I知道我必须使用SPARSE列(因为我的表有很多NULL值)。

任何想法如何为上述SQL脚本中的SPARSE列?

+0

@bluefeet你可以看看这个吗? – 2013-04-23 20:26:12

+0

为什么不使用属性名称作为元数据表中的记录,并在值表中使用该键? – 2013-06-01 09:44:42

回答

0

在这种情况下,我建议在数据库中组织数据时提取所有数据,并将结果后处理为PHP哈希数组。下面是伪代码示例,但我不知道你使用的PHP API对MySQL:

$sql = "SELECT datapoint, AttributeName, AttributeValue FROM yourtable"; 

/* execute $sql */ 

$data = array(); 
while (/* $row = fetch one row */) { 
    $data[$row["datapoint"]][$row["AttributeName"]] = $row["AttributeValue"]; 
} 

现在你有哈希阵列,为您的稀疏数据的数组$的数据。


回复您的评论:

好了,不够公平。如果你只是试图在MySQL中做到这一点,我的建议是不相关的。

您可能会遇到由GROUP_CONCAT()生成的字符串长度限制。组连接字符串的默认限制是1024字节。您的列是长表达式,至少是每个字符。因此,您最多可以在一个组中使用这些表达式中的15个 - concat字符串。

该组连接字符串长度限制可由变量group_concat_max_len配置。您可以将它配置为最多2个 -1或2 -1个字节。

mysql> SET group_concat_max_len = 1024*1024*1024; /* 1GB */ 
mysql> SELECT GROUP_CONCAT(...) ... INTO @sql; 

然后,当你准备一个@sql串入一个查询,就会有很多列,但IIRC在查询栏上的极限是4096,我会感到惊讶,如果你超过了。

+0

我们不使用PHP。我们正试图在MySQL中执行该程序。 – 2013-04-23 21:05:18