У меня есть запрос ниже;
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, так и те, у которых есть.
Но производительность для последнего запроса слишком низкая.
Есть ли лучший способ сделать это?