0

在尝试从我的 MYSQL DB 创建数据馈送时,我遇到了以下情况。实际情况中涉及更多表格,但我想保持简短并专注于手头的问题。我有两个表(products_options_values、products_options)和一个中间表(products_options_values_to_products_options)。(为表格的格式道歉,但我认为您可以区分每个字段的值。)

TABLE:  products_options_values<br>
products_options_values_id | products_options_values_name <br>
28 9-11<br>
52 Black<br>
53 In-Line<br>

TABLE: products_options_values_to_products_options<br>
products_options_values_to_products_options_id | products_options_id | products_options_values_id<br> 
    31  2   28<br>
    56  1   52<br>
    57  3   53<br>

TABLE: products_options<br>
products_options_id | products_options_name <br>
    1           Color<br>
    2           Size<br>
    3           Style<br>

我正在尝试编写具有以下结果的 SQL 语句:来自各种 TABLES 的有关产品的字段,其中 products_options_name 作为字段名称和对应的 products_options_values_name 以及同一行中的相应值。例如:

Product_ID   Product_Name       MPN Price   Color   Size    Style
00001   Acme Rollerskates   A99 99.99   Black   9-11    In-Line 

有关如何在 MYSQL 中实现此结果的任何帮助?感谢您的考虑和努力。标记

4

2 回答 2

0

我不确定你是否听说过 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'

通常会使用 id 而不是 join 子句中的字段名称,但您应该明白这一点。sql server 还提供了一个 PIVOT 函数,可以满足您的需要。我不相信有一个 Mysql 等价物,但你可以调查一下。

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

于 2013-01-06T15:27:34.070 回答
0

要将您提供的表转换为这种格式,您基本上是在执行数据透视,但 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

请参阅带有演示的 SQL Fiddle

结果是:

| COLOR | SIZE |   STYLE |
--------------------------
| Black | 9-11 | In-Line |

看来您仍然需要加入包含产品详细信息的表,如product_idproduct_nameprice等。

我无法从您提供的表结构中看出您在哪里加入此数据,但查询将是这样的:

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
于 2013-01-06T15:17:40.690 回答