最初のクエリには、WHERE句にORが含まれています。
WHERE pb.bike_id = 111 OR vb.bike_id = 111
2番目のクエリは、条件を介して、代わりに実質的にANDを持ちます。
LEFT JOIN product_bikes pb ON p.product_id = pb.product_id AND pb.bike_id = 111
...
LEFT JOIN variant_bikes vb ON vb.variant_id = pov.variant_id AND vb.bike_id = 111
ボーナスの質問:結合を使用して同じように動作させ、パフォーマンスのために結合を小さくすることでメリットを得る方法はありますか?
クエリを作成する方法はありますが、(私が考えている)メソッドはUNIONを使用しているため、必ずしも高速であるとは限りません。
select distinct p.product_id from cscart_products p
left join product_bikes pb on p.product_id = pb.product_id and pb.bike_id = 111
left join cscart_product_options po on po.product_id = p.product_id
left join cscart_product_option_variants pov on pov.option_id = po.option_id
left join variant_bikes vb on vb.variant_id = pov.variant_id -- and vb.bike_id = 111
UNION
select distinct p.product_id from cscart_products p
left join product_bikes pb on p.product_id = pb.product_id -- and pb.bike_id = 111
left join cscart_product_options po on po.product_id = p.product_id
left join cscart_product_option_variants pov on pov.option_id = po.option_id
left join variant_bikes vb on vb.variant_id = pov.variant_id and vb.bike_id = 111
次の行に沿ってUNIONサブクエリを作成するなど、おそらくより良い方法があります。
SELECT DISTINCT p.product_id
FROM cscart_products AS p
LEFT JOIN cscart_product_options AS po ON po.product_id = p.product_id
LEFT JOIN cscart_product_option_variants AS pov ON pov.option_id = po.option_id
LEFT JOIN (SELECT vb.product_id FROM variant_bikes AS vb WHERE vb.bike_id = 111
UNION
SELECT pb.product_id FROM product_bikes AS pb WHERE pb.bike_id = 111
) AS pv ON pv.product_id = p.product_id
cscart_product_options
(例では)またはテーブルからデータを選択していないためcscart_product_options_variants
、クエリからそれらを削除できます。また、サブクエリを使用したLEFTJOINが適切かどうかも確認する必要があります。内側の結合が必要になる可能性が高いと思います。パフォーマンスを向上させるために実行できる作業は他にもあるかもしれません。