0

MYSQL DB からデータフィードを作成しようとすると、次のような状況になります。実際の状況に関係するテーブルは他にもありますが、これは簡潔にして目前の問題に焦点を当てたいと思いました。2 つのテーブル (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 ステートメントを作成しようとしています。フィールド名として 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 について聞いたことがあるかどうかはわかりませんが、これは Magento の EAV セットアップに似ています。基本的に、行を列に変換したい場合は、行の値ごとに 1 回、フィールド値テーブルに LEFT 結合を繰り返す必要があります。以下に簡略化したバージョンを作成します。

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 が使用されますが、要点を理解する必要があります。また、SQL Server は、必要なことを実行できる PIVOT 関数を提供します。Mysql に相当するものはないと思いますが、調べることはできます。

編集: bluefeet の回答は、SQL サーバーの PIVOT 関数をシミュレートします。2005年より前は、SQLサーバーもそうしなければなりませんでした。私が回答している間に彼の回答が投稿されました。

于 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 に答える