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中。

但正如您所想象的,在LEFT OUTER JOINproduct_field_value表之后的INNER JOINproduct_colour表会过滤掉那些没有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。

最新更新