同じオプション値が割り当てられている製品を抽出するクエリを作成しようとしています。影響を受けるテーブルは次のとおりです。
products
| id |
rel_product_options
| product | option | value |
"option" is an id from "options" table
"value" is an option value id from "values" table (an option can have multiple values. eg. option "color" can have "red", "blue" etc.)
すべての製品には、「rel_product_options」テーブルで複数のオプションと値の組み合わせがあります。同じ製品のバリエーションに同じオプションと値のペアを含めることはできないため、オプションの値を変更する前に、次の値が他の製品と競合しないかどうかを確認する必要があります。仮定しましょう
- 商品A(色:赤、サイズ:10)
- 商品B(色:青、サイズ:10)
ここで、「製品 B」の色を「赤」に変更しようとすると、データベースで「製品 A」のオプションが同一であることがわかり、変更をキャンセルできるはずです。質問が明確で、正直なところ、どこから始めればよいかさえわかりません。SQLは、何度使用しても謎のようなものです...以下のコードのようなものから始めましたが、私は私が数えることができるよりも多くのレベルでおそらく間違っていると思うので、どんな助けも大歓迎です。
# my thoughts
SELECT P1.*, PO1.*, PO2.* FROM products AS P1
# first select the product we want to extract all options from
# THIS ALREADY IS WRONG, because one of the options is ABOUT TO CHANGE, but this code assumes it has already done that
JOIN rel_product_options AS PO1 ON (PO1.product = P1.id AND PO1.product = 1)
# now join all other products that do not have identical option-value pairs
LEFT JOIN rel_product_options AS PO2 ON (PO1.product != PO2.product AND PO1.`option` = PO2.`option` AND PO1.value = PO2.value)
# and ... i'm lost ...