2013-04-23 61 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