我正在使用下表存储产品数据:
mysql> SELECT * FROM product;
+---------------+---------------+--------+
| id | name | description | stock |
+---------------+---------------+--------+
| 1 | product1 | first product | 5 |
| 2 | product2 | second product| 5 |
+---------------+---------------+--------+
mysql> SELECT * FROM product_additional;
+-----------------+------------+
| id | fieldname | fieldvalue |
+-----------------+------------+
| 1 | size | S |
| 1 | height | 103 |
| 2 | size | L |
| 2 | height | 13 |
| 2 | color | black |
+-----------------+------------+
使用以下查询从两个表中选择记录
mysql> SELECT
p.id
, p.name
, p.description
,MAX(IF(pa.fieldname = 'size', pa.fieldvalue, NULL)) as `size`
,MAX(IF(pa.fieldname = 'height', pa.fieldvalue, NULL)) as `height`
,MAX(IF(pa.fieldname = 'color', pa.fieldvalue, NULL)) as `color`
FROM product p
LEFT JOIN product_additional AS pa ON p.id = pa.id
GROUP BY p.id
+---------------+---------------+--------+---------+--------+
| id | name | description | size | height | color |
+---------------+---------------+--------+---------+--------+
| 1 | product1 | first product | S | 103 | null |
| 2 | product2 | second product| L | 13 | black |
+---------------+---------------+--------+---------+--------+
一切都正常工作:)
因为我动态地填充了“附加”表,所以如果查询也是动态的,那就很好了。这样,我不必每次输入新的字段名和字段值就更改查询。
MySQL中动态执行此操作的唯一方法是使用Prepared语句。这是一篇关于它们的好文章:
动态数据透视表(将行转换为列)
您的代码如下所示:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(pa.fieldname = ''',
fieldname,
''', pa.fieldvalue, NULL)) AS ',
fieldname
)
) INTO @sql
FROM product_additional;
SET @sql = CONCAT('SELECT p.id
, p.name
, p.description, ', @sql, '
FROM product p
LEFT JOIN product_additional AS pa
ON p.id = pa.id
GROUP BY p.id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
观看演示
注意:GROUP_CONCAT函数的限制为1024个字符。参见参数group_concat_max_len
问题内容: 我试图获得一个带有动态列的数据透视表。当user_id是一个字符串时,它可以正常工作,但是如果它是一个int,那么它似乎会失败 到目前为止,在过去的问题帮助下,我得到的是: 参见:http : //sqlfiddle.com/#!2/eab24/1 我确定这很简单,但是我想念什么呢? 谢谢 问题答案: 由于值在其中,因此您要将它们设为列名,因此必须将值包装在反引号中 该SQL将看起来像
问题内容: 我知道这个话题无处不在,但我无法使其正常运行。这可能很简单。 这是基本查询后的数据示例: 我想要的是列名称是动态的: 到目前为止,根据我的研究,这是我整理的代码: 当我运行查询时,出现语法错误。 问题答案: 使用动态SQL 结果
假设我有三个不同的MySQL表: 表: 表: 表: 我想要得到一个表,合作伙伴在行和产品作为列。到目前为止,我能够得到如下输出: 使用此查询: 但我更想要这样的东西: 问题是,我无法告诉我将拥有多少个产品,因此需要根据products表中的行动态更改列号。 这个很好的答案似乎并不适用于MySQL:T-SQL Pivot?从行值创建表列的可能性
问题内容: 可以说我有三个不同的MySQL表: 表: 表: 表: 我想得到一个表格,其中行和产品列为合作伙伴。到目前为止,我已经能够获得如下输出: 使用此查询: 但我想改成这样: 问题是我无法知道我将拥有多少个产品,因此列号需要根据产品表中的行动态更改。 这个很好的答案似乎不适用于mysql:T-SQL Pivot吗?根据行值创建表格列的可能性 问题答案: 不幸的是,MySQL没有您基本上想做的功
问题内容: 我有这个表视图 如何创建将在Oracle 10g中提供此透视图视图的查询? 有没有办法动态地做到这一点?我看到了很多方法(解码,PL / SQL循环,联合,11g数据透视) 但根据上述示例,我尚未找到适合我的方法 编辑 :我不知道在开发时间产品的数量或类型,所以这必须是动态的 问题答案: Oracle 11g是第一个支持PIVOT / UNPIVOT的,因此您必须使用: 您可以使用DE
问题内容: 以下查询执行得很好… 输出看起来像 但是我的疑问是如何获取列的动态字段值。 那是 , 如何使用以上查询 问题答案: 要使PIVOT动态,您必须编写一个存储过程。 然后,您可以这样称呼它: