我有以下查询;
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 JOIN
到product_field_value
表之后的INNER JOIN
到product_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。