Mysql - 通过引用另一个数据集动态更改列名

时间:2018-03-08 04:20:36

标签: mysql pivot amazon-redshift

我有两个MySQL表,我需要使用另一个表中的行值动态重命名一个表的列。 例如:

TABLE_1:

Advertiser_ID, Ad_Id, Clicks, conv_342, conv_439
----------------------------------------------------------------------
23232         231112   5      10        12
23232         231119   22     34        19

TABLE_2:

conversion_id, conversion_name
-------------------------------
conv_342       Conversion_A
conv_439       Conversion_B

我需要将转换ID(表1中的列标题和表2中的行值)映射到转换名称,即表2值。

结果如下:

Advertiser_ID, Ad_Id, Clicks, Conversion_A, Conversion_B
----------------------------------------------------------------------
23232         231112   5      10        12
23232         231119   22     34        19

转换ID和名称的列表非常长,并且可以动态更改,因此此转轴无法进行硬编码。数据集开始时也非常大。我一直在寻找解决方案,但其他类似的问题都没有给我答案。

这是MySQL直接在MySQL引擎上运行,所以不允许编程语言(PHP,Python,R等)。

我尝试了什么

我能够使用以下代码确定Table_1列标题是否与Table_2中的行匹配:

SELECT COLUMN_NAME as 'fb_columns'
  FROM information_schema.columns 
 Where table_name='table1'
   AND COLUMN_NAME 
    IN (
         SELECT conversion_id 
           From table2
       )

但我无法弄清楚如何使用conversion_name重命名列。任何帮助或线索都会非常感激!

编辑:值得注意的是,如果您知道使用Amazon Redshift执行此操作的方法,我可以将资源从MySQL切换到Redshift。谢谢!

1 个答案:

答案 0 :(得分:0)

我最终使用MySQL搞清楚了。这是解决方案。

第1步:

DROP PROCEDURE IF EXISTS renameCols; 

第2步:

您需要两个表: original_cols ,其中应包含所有不需要重命名的列的列表。 (此查询可能类似于 select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = original_table_name。有关详细信息,请查看this link

然后 joined_mapping 应该包含需要重新命名的列以及新的列名。例如,在原始问题中,这将是标题我尝试过的内容下面的代码片段。 (确保 joined_mapping 没有NULL。)

然后,真正的好处是:

此过程使用GROUP_CONCAT()循环遍历所有cols(需要重命名的列),并使用joined_mapping中的Name列重命名它们。然后它还包括所有original_cols(不应重命名的列)。

CREATE PROCEDURE renameCols ()
BEGIN

DROP TABLE IF EXISTS new_table;
SET session group_concat_max_len = 18446744073709551615;
SET @originals = NULL;
SET @cols = NULL;
START TRANSACTION;

SELECT GROUP_CONCAT(DISTINCT CONCAT('`',col,'`')) INTO @originals FROM original_cols;

SELECT
    GROUP_CONCAT(DISTINCT CONCAT ('`',original_column_name,'` as "Conversion: ',conversion_name,'"')) INTO @cols
FROM joined_mapping;

SET @sql = CONCAT("CREATE TABLE new_table AS select ", @originals, " 
                   , ", @cols ," from fb_direct");

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END

第3步:

CALL renameCols()

第4步:

SELECT * FROM new_table