[英]Mysql INNER JOIN after a LEFT OUTER JOIN
我有以下查詢;
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 JOIN
到product_colour
表后LEFT OUTER JOIN
到product_field_value
表,過濾掉那些沒有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 和那些有的。
但是最新查詢的性能太慢了。
有一個更好的方法嗎 ?
如果將邏輯移到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)
我認為這可以滿足您的要求:
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;
如果第二個表上沒有匹配項,則最后一個ON
子句的計算結果為NULL
,這被視為 false。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.