我使用下面的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列吗?
答案 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.如果你超过它,我会感到惊讶。