2011-09-29 61 views
0

我有一個鍵值表(MySQL的)數據,其具有的形狀:關鍵值表,查看與變量列

id, key, value 

現在出口到我的用戶,我需要把它改造成一個表中所有的鍵作爲列。 (實際上〜100個鍵中只有~20個需要在該表中)

該工作流程將爲我的用戶提供,以便他們可以更正表格並重新導入表格。

我只是在寫一個相當複雜的選擇命令給我這樣的表。它已經有些長命令了,我希望它不需要被調試。

我不禁想,這應該是一個已經解決了的問題;)

所以我希望每個人都可以給我提供了一些線索。

+1

使用[EAV數據模型](http://en.wikipedia.org/wiki/Entity-attribute-value_model)時,預計會有大量連接的長查詢。 –

+1

請參閱http://stackoverflow.com/questions/649802/how-to-pivot-a-mysql-entity-attribute-value-schema – Galz

+0

ah - EAV是我一直在尋找的關鍵字。無論如何,我仍然很難做。 – bdecaf

回答

0

到目前爲止,我一起攻擊了構建視圖的腳本。

DROP PROCEDURE IF EXISTS view_test; 
DELIMITER // 
CREATE PROCEDURE view_test() 
BEGIN 
DECLARE done INT DEFAULT 0; 
DECLARE curr_prop VARCHAR(31); 
DECLARE curr_table VARCHAR(31); 
DECLARE fixed_prop VARCHAR(31); 
DECLARE statement_a LONGTEXT DEFAULT 'SELECT pd.id,t0.date'; 
DECLARE statement_b LONGTEXT DEFAULT "FROM xxx.codes AS pd INNER JOIN  
    xxx.eav AS t0 ON (pd.id = t0.idX)"; 
DECLARE n_prop INT DEFAULT 0; 

DECLARE cur1 CURSOR FOR SELECT DISTINCT prop FROM xxx.eav LIMIT 59; 

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 

OPEN cur1; 

main_loop: LOOP 
FETCH cur1 INTO curr_prop; 
IF done 
    THEN LEAVE main_loop; 
END IF; 
SET fixed_prop = curr_prop; 
SET fixed_prop = REPLACE(fixed_prop,'-','_'); 
SET fixed_prop = REPLACE(fixed_prop,'+','_'); 
SET fixed_prop = REPLACE(fixed_prop,' ','_'); 
SET n_prop = n_prop + 1; 

SET curr_table = CONCAT('t',n_prop); 
SET statement_a = CONCAT(statement_a,',\n',curr_table,'.value AS ', fixed_prop); 
SET statement_b = CONCAT(statement_b,' \nLEFT JOIN xxx.eav AS ',curr_table, 
    ' ON (',curr_table,'.idX=pd.id AND t0.date=',curr_table,'.date AND  
    ',curr_table,'.prop="',curr_prop,'")');  
END LOOP; 
-- cleanup 
CLOSE cur1; 

SET @S = CONCAT('CREATE OR REPLACE VIEW auto_flat_table AS\n',statement_a, 
'\n',statement_b, 
    '\nGROUP BY pd.id,t0.date'); -- ,'\nGROUP BY pd.id' 

PREPARE stmt_auto_demo FROM @S; 
EXECUTE stmt_auto_demo; 
DEALLOCATE PREPARE stmt_auto_demo; 
END // 
DELIMITER ; 

CALL view_test(); 

這將創造我自己這樣的觀點 - 雖然我有點困惑,爲什麼這GROUP BY是neccesary。

不是SQL開發人員我很確定我在這個程序中走了很長的路。

此外,我只能夠使用61表連接是一個無賴。我想我們很快就會需要更多。