MySQL创建行到列

时间:2019-03-25 17:20:52

标签: mysql

我想将mysql行转换为列,我试过但没有获得所需的输出。先感谢您。 我的表格查询是

第一张桌子

CREATE TABLE `variant_to_group` (
 `variant_to_group_ID` int(11) NOT NULL AUTO_INCREMENT,
 `variant_group_ID` int(11) NOT NULL,
 `variant_ID` int(11) NOT NULL,
 PRIMARY KEY (`variant_to_group_ID`)
)
INSERT INTO `products_to_variants` (`products_to_variants_ID`, `variant_ID`, `variant_value`, `variant_group_ID`) VALUES
(1, 1, 'STD', 1),
(2, 1, '25', 1),
(3, 1, '50', 1),
(4, 1, '75', 1),
(5, 1, '100', 1),
(6, 2, 'USHA', 1),
(7, 2, 'SAM', 1),
(8, 2, 'Getzo', 1);

第二张桌子

CREATE TABLE `products_new` (
 `product_ID` int(11) NOT NULL AUTO_INCREMENT,
 `product_name` varchar(100) NOT NULL,
 `brand_ID` int(11) NOT NULL,
 `categories_ID` int(11) NOT NULL,
 `product_variant_group_ID` int(11) NOT NULL,
 PRIMARY KEY (`product_ID`)
) 

INSERT INTO `products_new` (`product_ID`, `product_name`, `brand_ID`, `categories_ID`, `product_variant_group_ID`) VALUES
(1, 'Hero Honda CD 100', 1, 1, 1);

,所需的输出是-

product_name    categories_ID   variant_value_1 variant_value_2
Hero Honda CD 100   1   STD         USHA
Hero Honda CD 100   1   25          USHA
Hero Honda CD 100   1   50          USHA
Hero Honda CD 100   1   75          USHA
Hero Honda CD 100   1   100         USHA
Hero Honda CD 100   1   STD         SAM
Hero Honda CD 100   1   25          SAM
Hero Honda CD 100   1   50          SAM
Hero Honda CD 100   1   75          SAM
Hero Honda CD 100   1   100         SAM
Hero Honda CD 100   1   STD         Getzo
Hero Honda CD 100   1   25          Getzo
Hero Honda CD 100   1   50          Getzo
Hero Honda CD 100   1   75          Getzo
Hero Honda CD 100   1   100         Getzo

我尝试了来自google和stackoverflow的一些搜索结果,但我未能生成以上输出

2 个答案:

答案 0 :(得分:0)

您需要执行联接才能获得所需的输出

SELECT * FROM `products_new` 
INNER JOIN `variant_to_group`  
ON `products_new`.`variant_group_ID` = `products_new`.`product_variant_group_ID`;

答案 1 :(得分:0)

请尝试以下查询。它应该产生与您期望的一样的精确输出。

SELECT product_name,categories_ID,v1.variant_value AS "variant_value_1",
v2.variant_value  AS "variant_value_2" 
FROM products_new 

LEFT JOIN
(SELECT * FROM products_to_variants WHERE variant_ID=1) v1 
ON products_new.product_id = products_new.product_variant_group_ID 

LEFT JOIN
(SELECT * FROM products_to_variants WHERE variant_ID=2) v2 
ON products_new.product_id = products_new.product_variant_group_ID
ORDER BY v2.variant_value;

对上面的查询有一点解释,我将您的products_new表用作LEFT JOIN的引用。如果您查看我提供的查询,则表明我正在加入:

products_new.product_id = products_new.product_variant_group_ID

就知道此联接是否有效,取决于您,但我认为这是有效的。然后,我为两个子查询分配了v1v2别名。我对这些子查询中的每一个定义的variant_ID值都不同。至于我为什么使用LEFT JOIN的原因,是因为您的预期输出需要variant_value列并排以variant_ID值区分。

但是,此查询将仅满足您给定的示例数据和预期的输出。因此,如果您希望通过此查询满足其他条件,请使用其他信息更新您的问题。