我有两个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。谢谢!
答案 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