2013-04-23 2 views
1

내가 같은 테이블을 변환하는 동적 SQL SCRIPT 아래를 사용한

(1, ATTRIBUTENAME1, Attributevalue1)
(1, ATTRIBUTENAME2, Attributevalue2)
(2, AttributeName1, Attributevalue1)
(2, AttributeName2, Attributevalue2)
.
.
.
(11113, ATTRIBUTENAME2, Attributevalue2) 테이블에

포맷 아래

(된 Datapoint, ATTRIBUTENAME1, ATTRIBUTENAME2, .........로 AttributeNamen)
(1, AttributeValue1, AttributeValue2, .........................)
(2, AttributeValue1, AttributeValue2, ..... ....................)
.
.
.
(11113, AttributeValue1, AttributeValue2, .........................)

======== ====== DYNAMIC 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 노하우 내 테이블에 많은 NULL 값이 있기 때문에 SPARSE 컬럼을 사용해야한다.

위의 SQL 스크립트에서 열을 어떻게 SPARSE 할 수 있습니까?

+0

@bluefeet 좀 보시고 싶습니까? –

+0

메타 데이터 테이블의 레코드로 특성 이름을 사용하지 않고 값 테이블의 키를 사용하는 이유는 무엇입니까? –

답변

0

이 시나리오에서는 모든 데이터가 데이터베이스에서 구성 될 때 가져와서 결과를 PHP 해시 배열로 후 처리하는 것이 좋습니다. 여기에 의사 코드의 예입니다,하지만 난 당신이 사용하는 MySQL 용하는 PHP 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()에서 생성 한 문자열의 길이에 제한이 있습니다. 그룹 연결 문자열의 기본 한계는 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에서 프로그램을 실행하려고합니다. –