如何在动态SQL脚本中使用稀疏列

时间:2013-04-23 20:14:18

标签: mysql sql pivot-table entity-attribute-value

我使用下面的DYNAMIC SQL SCRIPT来转换像

这样的表格
  

(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,.........................)

============== DYNAMIC SQL SCRIPT ================

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列数限制不足。我知道我必须使用SPARSE列(因为我的表有很多NULL值)。

知道如何在上面的SQL脚本中使用SPARSE列吗?

1 个答案:

答案 0 :(得分:0)

在这种情况下,我建议在数据库中组织所有数据,然后将结果后处理到PHP哈希数组中。这是一个伪代码示例,但我不知道您使用哪个MySQL API:

$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()生成的字符串长度限制。 group-concat字符串的默认限制是1024字节。您的列是长表达式,至少是每个字符。因此,在一个group-concat字符串中最多可以包含15个这样的表达式。

该组连续字符串长度限制可由变量group_concat_max_len配置。您可以将其配置为2 32 -1或2 64 -1个字节。

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

然后当你将@sql字符串准备到一个查询中时,它会有很多列,但是IIRC对查询中列的限制是4096.如果你超过它,我会感到惊讶。