0

製品と一連の属性を含むカテゴリがあります。それらの属性は「形状」と「直径」です。

フィルターを適用せずにカテゴリを開くと、次のクエリで製品を取得します。

"SELECT * FROM `products` 
WHERE `category_id` 
IN ('6', '7', '29', '8', '9', '36')"

次に、属性「直径」(id = 2) と値「8mm」(id = 4) をクリックして、次のクエリを生成します。

"SELECT * FROM `products`
JOIN `products_attributes_values`
ON (`products_attributes_values`.`product_id` = `products`.`id`)
WHERE `category_id` IN ('6', '7', '29', '8', '9', '36')
AND `products_attributes_values`.`attribute_id` = 2
AND `products_attributes_values`.`value_id` = ('4')"

そして、必要なものを取得します。すべてのビーズは「直径 8mm」です 次に、製品をさらにフィルタリングし、値「ラウンド」(id = 11) の属性「形状」(id = 3) をクリックします。クエリは次のようになります。

"SELECT * FROM `products` 
JOIN `products_attributes_values`
ON (`products_attributes_values`.`product_id` = `products`.`id`)
WHERE `category_id` IN ('6', '7', '29', '8', '9', '36')
AND `products_attributes_values`.`attribute_id` = 2
AND `products_attributes_values`.`value_id` = ('4')
AND `products_attributes_values`.`attribute_id` = 3
AND `products_attributes_values`.`value_id` = ('11')"

何もない代わりに、直径8mmの丸い形のビーズを手に入れたい. 個別に、すべてのフィルターは正常に機能します。上記の例のようにそれらを混ぜたいときはうまくいきません。ジョブを完了するには、クエリをどのように変更する必要がありますか?

ありがとう。

アップデート:

1 つの属性の複数の値を、1 つまたは複数の別の属性と組み合わせたいと考えています。

たとえば、直径(id=2)が8mm(id=4)または直径(id=2)が10mm(id=5)で、形状(id=3)が円形(id=11)または形状のビーズを取得したい(id=3) ファセット(id=62)

最後に、ラウンドまたはファセット形状の 8mm または 10mm ビーズの両方を取得したいと考えています。

4

1 に答える 1

1

各フィルターはテーブル内のまったく異なるレコードを参照する必要があるため、2 つのフィルターは個別に処理する必要がありproducts_attributes_valuesます。

SELECT * FROM products
WHERE category_id IN ('6', '7', '29', '8', '9', '36')
    AND id IN (
        SELECT product_id
        FROM products_attributes_values
        WHERE attribute_id = 2
            AND value_id = '4')
    AND id IN (
        SELECT product_id
        FROM products_attributes_values
        WHERE attribute_id = 3
            AND value_id = '11')

UAMoto より:

その作業は少し遅いので、ある人が私に言ったように結合エイリアスを使用しました:

"SELECT * FROM `products`
JOIN `products_attributes_values` AS pav1
ON (`pav1`.`product_id` = `products`.`id`)
JOIN `products_attributes_values` AS pav2
ON (`pav2`.`product_id` = `products`.`id`)
WHERE `category_id` IN ('6', '7', '29', '8', '9', '36')
AND (`pav1`.`attribute_id` = '2' AND `pav1`.`value_id` = '4')
AND (`pav2`.`attribute_id` = '3' AND `pav2`.`value_id` = '11')"

属性の組み合わせの更新されたクエリ:

SELECT * FROM products
WHERE category_id IN ('6', '7', '29', '8', '9', '36')
    AND id IN (
        SELECT product_id
        FROM products_attributes_values
        WHERE attribute_id = 2
            AND value_id IN ('4', '5'))
    AND id IN (
        SELECT product_id
        FROM products_attributes_values
        WHERE attribute_id = 3
            AND value_id IN ('11', '62'))

また

SELECT *
FROM `products`
    JOIN `products_attributes_values` AS pav1 ON (`pav1`.`product_id` = `products`.`id`)
    JOIN `products_attributes_values` AS pav2 ON (`pav2`.`product_id` = `products`.`id`)
WHERE `category_id` IN ('6', '7', '29', '8', '9', '36')
AND (`pav1`.`attribute_id` = '2' AND `pav1`.`value_id` IN ('4', '5'))
AND (`pav2`.`attribute_id` = '3' AND `pav2`.`value_id` IN ('11', '62'))
于 2013-04-14T00:03:31.687 に答える