0

私は mySQL クエリを作成することに慣れていないため、作業を完了できませんでした。皆さんが私の質問に対する答えを知っていることを願っています。

商品にオプションをつけたい。タンクトップのモデルとダイヤモンドが付いた黒い T シャツを持っている場合のように。黒の T シャツのタンクトップ モデルとダイヤモンドの列が必要です。私はそれを次のようにしたい:

table: product_option
--------------------------------
product_option_id   name    product_combination_id
1                   Black   1
2                   Diamond 1
3                   Tanktop 1
4                   Option  2
5                   Option  2

table: product_combination
--------------------------------
product_combination_id   name                         
1                        Black tanktop with diamonds

だから私の質問はです。product_options を照会して、そこから product_combination 行を取得することは可能ですか?

皆さんが私の質問に対する答えを知っていることを願っています! お時間をいただきありがとうございます:)

編集:

私の質問は一般的すぎると思います。より具体的に質問したいと思います。

まあ言ってみれば。私は服を扱う店を持っています。私は商品を持っています (T シャツとしましょう)。そして、選択できるオプションがいくつかあります。

このような:

Color:
- Black
- Red
- Orange

Size
- Large
- Xtra Large
- Medium
- Small

Accessoire:
- Diamonds
- Printed
- Swarovski 

ダイヤモンドが入ったブラック/エクストララージTシャツを購入したいとしましょう。次に、product_combinationブラック/ラージ/ダイヤモンド ロウである必要があります。多対多の関係を持つ外部テーブルが必要だと思います。次の列を持つ product_combination_option テーブルと同様です。

 product_combination_option
 - product_combination_option_id
 - product_combination_id
 - product_option_id

しかし、もう一度。product_combination誰かがブラック/ダイヤモンド付きエクストララージを選択したときにクエリを実行して、それがどれであるかを見つけるにはどうすればよいですか?

私は今、少しはっきりしていることを願っています。質問の更新が遅くなってすみません!私はあなたのすべての答えにとても感謝しています!

4

2 に答える 2

0

お持ちの製品に基づいて組み合わせを選択できるように、あなたが探しているのはテーブルに参加することだと思います。
そのため、クエリは次のようになります

Select * 
from product_option inner join product_combination
using(product_combination_id);

これにより、2 つのテーブルが結合されます。* を、表示/取得する属性のリストに置き換えることができます。

于 2013-08-23T22:50:27.967 に答える
0

product_combinationオプションのリストをクエリに渡して、一致するエントリのリストを取得する場合は、次の 1 つの方法があります。

SELECT *
FROM product_combination
WHERE product_combination_id IN (
  SELECT product_combination
  FROM product_option
  WHERE name IN ('option1', 'option2', 'option3')
  GROUP BY product_combination
  HAVING COUNT(*) = 3
);

product_combinationサブクエリは、要求された 3 つのオプションすべてを持つ一連の値を返します。このCOUNT(*) = 3条件は、単一のproduct_combination値に重複するname値が関連付けられていないことを前提としています。(これは当然のことですが、テーブルに対応する制限がない場合は、 に置き換えCOUNT(*)COUNT(DISTINCT name)、返されるグループに指定された 3 つのオプションすべてが含まれ、同じオプションを含む行が 3 つだけ含まれないようにすることができます。)

もちろん、クエリされるオプションの数が固定されていない場合は、IN 述語のためにクエリを動的に作成する必要があります。これは、(アイテムの数に関して) パラメータ化できないためです。ただし、ハードコードされたリストの代わりに一時的な行セットを使用してみることができます。問題のクエリを実行する前に、テーブルにデータが入力されます。この場合、この効果に合わせて変更されます。

SELECT *
FROM product_combination
WHERE product_combination_id IN (
  SELECT product_combination
  FROM product_option
  WHERE name IN (SELECT option_name FROM requested_options)
  GROUP BY product_combination
  HAVING COUNT(*) = (SELECT COUNT(*) FROM requested_options)
);

上記のクエリでは、 は一時ストレージの名前です (一時テーブルの可能性がありますrequested_optionsが、別のクエリで作成され、事前に入力されたものに MySQL がアクセスできるかどうかはわかりません)。option_nameオプションが要求されています。

于 2013-08-24T20:12:38.300 に答える