mysql 变体到来自 sql 查询的列

Posted

技术标签:

【中文标题】mysql 变体到来自 sql 查询的列【英文标题】:mysql variants to columns from sql query 【发布时间】:2020-11-22 17:54:48 【问题描述】:

我有一个 mysql 表,它具有简化目的 sku,并且该 sku 有一组未知的属性值

skus
------
id, sku, qty
1, abc, 10
2, bvcc, 20

variantvalues
-------------
id, sku_id, variant_id, value
1, 1, 1, red
1, 1, 2, medium

variants
--------
id, name 
1, color
2, size
.....

EXPECTED RESULT
id, sku, color, size, qty
-------------------------
1, abc, red, medium, 10

我面临的挑战是,我是否可以进行查询,将数据作为 skus 列表提供给我,然后为它们的每个变体和变体值提供列...这样,如果我添加了新变体选项...比如说,性别,到变量表,它被归因于一个 sku,那么会有一个新列吗?

问题来源于这个问题:Modeling Product Variants

【问题讨论】:

请向我们展示您想要的结果。 当你评论时我一定是在添加它...见原始问题,代码部分结束。 刚找到这个,有帮助吗? ubiq.co/database-blog/transpose-rows-columns-dynamically-mysql我想你基本上是想创建一个 Excel 数据透视表,对吧? 【参考方案1】:

您正在描述一个动态枢轴。基本上你需要动态生成查询字符串,使用sql查询,然后执行。

这是在 MySQL 中使用准备好的语句的一种方法:

set @sql = null;

select group_concat(distinct 
    'max(case when v.name = ''', name, ''' then vv.value end) as `', name, '`'
) into @sql
from variants;

set @sql = concat(
    'select s.id, s.sku, ',  
    @sql,
    ' from skus s
    inner join variantvalues vv on vv.sku_id = s.id
    inner join variants v on v.id = vv.variant_id
    group by s.id, s.sku'
);

prepare stmt from @sql;
execute stmt;
deallocate prepare stmt;

【讨论】:

以上是关于mysql 变体到来自 sql 查询的列的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询有条件地连接来自不同数据库的列

30个mysql千万级大数据SQL查询优化技巧详解

30个mysql千万级大数据SQL查询优化技巧详解

用于连接 Oracle 中多行的列值的 SQL 查询

MySQL 怎样分组查询

MySQL 查询以获取产品变体