LEFT OUTER JOINを後にMySQLのINNER JOINは

paroxit:

私は、クエリの下に持っています。

SELECT * FROM product pr
LEFT OUTER JOIN product_field_value pfv ON pfv.product_id = pr.id AND pfv.product_field_id = 64
INNER JOIN product_colour pc ON pc.id = pfv.value

今、いないすべての製品は、product_field_valueに対応しています

ON pfv.product_id = pr.id AND pfv.product_field_id = 64

しかし、中に対応する行を持っているものproduct_field_valueの表は、インナーに参加する必要がありますproduct_colourも。

しかし、あなたが想像通りINNER JOINproduct_colourした後、テーブルLEFT OUTER JOINproduct_field_valueテーブル、DOES NOT HAVEのものフィルタアウトproduct_field_value関係を。

私はこのソリューションを作ってみたので、

SELECT * FROM product pr
LEFT OUTER JOIN (SELECT colourPfv.name as name,pfv.product_id as productId,pfv.product_field_id as productFieldId FROM product_field_value pfv
              INNER JOIN product_colour colourPfv on pfv.value = colourPfv.id) colourRel ON colourRel.productId = pr.id AND colourRel.productFieldId = 64

そして、このクエリが返すの両方product_field_value、それら持っていることに対応していないもの。

しかし、最新のクエリのパフォーマンスが遅すぎます。

これを行うには良い方法はありますか?

GMB:

あなたがにロジックを移動した場合どのようなWHERE句、パフォーマンスが良いですか?

SELECT * FROM product pr
LEFT JOIN product_field_value pfv 
    ON pfv.product_id = pr.id AND pfv.product_field_id = 64
LEFT JOIN product_colour pc ON pc.id = pfv.value
WHERE pfv.product_id IS NULL OR (pfv.product_id IS NOT NULL AND pc.id IS NOT NULL)

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=13535&siteId=1