繁体   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