簡體   English   中英

左外連接后的 Mysql 內連接

[英]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 JOINproduct_colour表后LEFT OUTER JOINproduct_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM