要使用变量列查看的键值表

时间:2011-09-29 14:32:01

标签: mysql view key-value

我的数据位于键值表(在MySql中),其形状为:

id, key, value

现在要导出到我的用户,我需要将其转换为一个表,其中所有键都作为列。 (实际上只有~20个键中约有20个需要在该表中)

工作流程是为我的用户提供,以便他们可以更正表格并重新导入表格。

我只是在编写一个非常复杂的select命令来给我这样一个表。它已经是一些长命令,我希望它不需要调试。

我不禁想到这应该是一个已经解决的问题;)

所以我希望有人能为我提供一些线索。

1 个答案:

答案 0 :(得分: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是必要的。

不是SQL开发人员我很确定我在这个程序中花了很长时间。

另外,我只能使用61个表进行连接是一个无赖。我想我们很快就会需要更多。