1

以下の DYNAMIC SQL SCRIPT を使用して、次のようなテーブルを変換しました

(1,属性名1,属性値1)
(1,属性名2,属性値2)
(2,属性名1,属性値1) (2,属性名
2,属性値2)
.
.
.
(11113,属性名2,属性値2)

以下の形式のテーブルへ

(Datapoint,AttributeName1,AttributeName2,........AttributeNamen)
(1,AttributeValue1,AttributeValue2,.................. ....)
(2,AttributeValue1,AttributeValue2,...................................)
.
.
.
(11113、属性値 1、属性値 2、..................................)

==============動的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 列数の制限を使い果たしています。SPARSE 列を使用する必要があることはわかっています (テーブルに多くの NULL 値があるため)。

上記のSQLスクリプトでSPARSE列を作成する方法はありますか?

4

1 に答える 1

0

このシナリオでは、データベース内で編成されているすべてのデータをフェッチし、結果を後処理して PHP ハッシュ配列にすることをお勧めします。以下は疑似コードの例ですが、どの PHP API for MySQL を使用しているかわかりません。

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

/* execute $sql */

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

これで、スパース データのハッシュ配列の配列 $data ができました。


あなたのコメントについて:

わかりました、十分に公平です。MySQL のみでこれを行おうとしている場合、上記の私の提案は関係ありません。

GROUP_CONCAT() によって生成される文字列の長さの制限に達している可能性があります。group-concat 文字列のデフォルトの制限は 1024 バイトです。あなたの列は長い式で、少なくともそれぞれの文字です。したがって、1 つの group-concat 文字列にこれらの式を最大 15 個含めることができます。

その group-concat 文字列の長さ制限は、変数によって構成可能ですgroup_concat_max_len2 32 -1 または 2 64 -1 バイトまで設定できます。

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

次に、その @sql 文字列をクエリに準備すると、多くの列が含まれますが、IIRC ではクエリ内の列の制限は 4096 です。それを超えている場合は驚くでしょう。

于 2013-04-23T20:55:02.087 に答える