[英]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.