1

クエリが特定のバリエーション価格範囲内の製品セットを返すように、製品テーブルをクエリしようとしています。製品には多くのバリエーションがあり、バリエーションは製品に属しています。動作している次のクエリがありますが、非常に遅いです。クエリには 1.66 秒かかります。

SELECT colortags.tag, products.*, (SELECT variants.price FROM variants WHERE variants.product_id = products.product_id LIMIT 1) price, collects.position 
FROM products
INNER JOIN wp_wps_collects collects 
ON products.product_id = collects.product_id 
AND collects.collection_id = 123456788
INNER JOIN wp_wps_tags colortags 
ON colortags.product_id = collects.product_id 
AND (colortags.tag = 'black' OR colortags.tag = 'nav') 
INNER JOIN wp_wps_tags styletags 
ON styletags.product_id = collects.product_id 
AND (styletags.tag = 'purses')
WHERE (SELECT variants.price FROM variants WHERE variants.product_id = products.product_id AND variants.price >= 200 AND variants.price < 300 LIMIT 1) > 0
AND (SELECT variants.price FROM variants WHERE variants.product_id = products.product_id AND variants.price >= 200 AND variants.price < 300 LIMIT 1) <> 0

ステートメントでは、SELECT ステートメントでサブクエリによって作成されWHEREた値をチェックしようとしましpriceたが、MYSQL はそれpriceが未定義であると教えてくれます。SQLは次のとおりです。

SELECT colortags.tag, products.*, (SELECT variants.price FROM wp_wps_variants variants WHERE variants.product_id = products.product_id LIMIT 1) price, collects.position 
FROM wp_wps_products products
INNER JOIN wp_wps_collects collects 
ON products.product_id = collects.product_id 
AND collects.collection_id = 98515058801
INNER JOIN wp_wps_tags colortags 
ON colortags.product_id = collects.product_id 
AND (colortags.tag = 'color:generic-black' OR colortags.tag = 'color:navy') 
INNER JOIN wp_wps_tags styletags 
ON styletags.product_id = collects.product_id 
AND (styletags.tag = 'style:totes')
WHERE price >= 200 
AND price < 300

これは、すぐ上の SQL から得られるエラー メッセージです。

「where句」の不明な列「価格」

また、テーブルで一連の結合を使用しようとしましたvariantsが、重複した製品が返されます。これがSQLです

SELECT colortags.tag, products.*, (SELECT variants.price FROM variants WHERE variants.product_id = products.product_id LIMIT 1) price, collects.position 
FROM products
INNER JOIN collects 
ON products.product_id = collects.product_id 
AND collects.collection_id = 1234566
INNER JOIN colortags 
ON colortags.product_id = collects.product_id 
AND (colortags.tag = 'black' OR colortags.tag = 'navy') 
INNER JOIN styletags 
ON styletags.product_id = collects.product_id 
AND (styletags.tag = 'purses')
INNER JOIN variants
ON variants.product_id = products.product_id
AND variants.price >= 200 
AND variants.price < 300
AND variants.price > 0
AND variants.price <> 0

私が望むのは、パフォーマンス ヒットなしで最初の SQL ステートメントから取得されたクエリ結果です。INNER JOINバリアント テーブルに を使用して SQL を記述し、重複した製品を取得せずに誤った価格のバリアントを除外できると考えたいのですが、その方法を特定できません。

ここに SQL を記述して、特定のバリエーションの価格範囲内の製品をクエリできるようにする方法を知っている人はいますか?

4

2 に答える 2