Mysql SQL-将多行转换为一行

Mysql SQL-将多行转换为一行,mysql,Mysql,在尝试从MYSQL数据库创建数据源时,我遇到了以下情况。实际情况中涉及到更多的表格,但我想保持简短,并将重点放在手头的问题上。我有两个表(产品选项值、产品选项)和一个中间表(产品选项值到产品选项)。(表的格式很抱歉,但我认为您可以区分每个字段的值。) 关于如何在MYSQL中实现这个结果,有什么帮助吗?谢谢你的考虑和努力。标记要将提供的表转换成这种格式,您基本上是在执行透视,但MySQL没有透视功能。因此,您需要使用带有CASE语句的聚合函数来复制它: select max(case whe

在尝试从MYSQL数据库创建数据源时,我遇到了以下情况。实际情况中涉及到更多的表格,但我想保持简短,并将重点放在手头的问题上。我有两个表(产品选项值、产品选项)和一个中间表(产品选项值到产品选项)。(表的格式很抱歉,但我认为您可以区分每个字段的值。)


关于如何在MYSQL中实现这个结果,有什么帮助吗?谢谢你的考虑和努力。标记

要将提供的表转换成这种格式,您基本上是在执行透视,但MySQL没有透视功能。因此,您需要使用带有
CASE
语句的聚合函数来复制它:

select 
  max(case when po.products_options_name = 'Color' 
      then pov.products_options_values_name else null end) Color,
  max(case when po.products_options_name = 'Size' 
      then pov.products_options_values_name else null end) Size,
  max(case when po.products_options_name = 'Style' 
      then pov.products_options_values_name else null end) Style
from products_options po
left join products_options_values_to_products_options pv
  on po.products_options_id = pv.products_options_id
left join products_options_values pov
  on pv.products_options_values_id = pov.products_options_values_id

结果是:

| COLOR | SIZE |   STYLE |
--------------------------
| Black | 9-11 | In-Line |
似乎您仍需要加入包含产品详细信息的表,如
产品id
产品名称
价格

我无法从您提供的表结构判断您在何处加入此数据,但查询如下所示:

select p.product_id,
  p.product_name,
  p.MPN,
  p.price,
  max(case when po.products_options_name = 'Color' 
      then pov.products_options_values_name else null end) Color,
  max(case when po.products_options_name = 'Size' 
      then pov.products_options_values_name else null end) Size,
  max(case when po.products_options_name = 'Style' 
      then pov.products_options_values_name else null end) Style
from products p  --- add join to the main products table
left join products_options po
  on p.product_id = po.products_options_id
left join products_options_values_to_products_options pv
  on po.products_options_id = pv.products_options_id
left join products_options_values pov
  on pv.products_options_values_id = pov.products_options_values_id
group by p.product_id, p.product_name, p.MPN, p.price

我不确定您是否听说过Magento,但这与他们的EAV设置类似。基本上,如果要将行转换为列,则必须重复地将每行值左键连接到字段值表一次。我将在下面做一个简化版本

products table:
[id, product_name]
1, product 1
2, product 2
3, product 3

product_fields table:
[id, product_id, field_name, field_value]
1, 1, color, red
2, 2, color, blue
3, 3, color, black
4, 1, size, XL
5, 2, size, XL
6, 3, size, XL

SELECT 
    p.product_name,
    table1.field_value AS color,
    table2.field_value AS size
FROM
    products AS p LEFT JOIN product_fields AS table1 ON
        p.id = table1.product_id AND
        table1.field_name='color'
    LEFT JOIN product_fields AS table2 ON
        p.id = table2.product_id AND
        table1.field_name='size'
通常在join子句中使用id而不是字段名,但您应该明白这一点。sql server还提供了一个PIVOT函数,可以满足您的需要。我不相信有Mysql的等价物,但你可以研究一下


编辑:BlueFoot的回答模拟了sql server的PIVOT功能。在2005年之前,sql server也必须这样做。他的答案是在我回答的时候发布的。

这就是你所说的
join
。表结果。产品表在哪里?您将
产品标识
产品名称
存储在哪里?
select p.product_id,
  p.product_name,
  p.MPN,
  p.price,
  max(case when po.products_options_name = 'Color' 
      then pov.products_options_values_name else null end) Color,
  max(case when po.products_options_name = 'Size' 
      then pov.products_options_values_name else null end) Size,
  max(case when po.products_options_name = 'Style' 
      then pov.products_options_values_name else null end) Style
from products p  --- add join to the main products table
left join products_options po
  on p.product_id = po.products_options_id
left join products_options_values_to_products_options pv
  on po.products_options_id = pv.products_options_id
left join products_options_values pov
  on pv.products_options_values_id = pov.products_options_values_id
group by p.product_id, p.product_name, p.MPN, p.price
products table:
[id, product_name]
1, product 1
2, product 2
3, product 3

product_fields table:
[id, product_id, field_name, field_value]
1, 1, color, red
2, 2, color, blue
3, 3, color, black
4, 1, size, XL
5, 2, size, XL
6, 3, size, XL

SELECT 
    p.product_name,
    table1.field_value AS color,
    table2.field_value AS size
FROM
    products AS p LEFT JOIN product_fields AS table1 ON
        p.id = table1.product_id AND
        table1.field_name='color'
    LEFT JOIN product_fields AS table2 ON
        p.id = table2.product_id AND
        table1.field_name='size'