Mysql ВНУТРЕННЕЕ СОЕДИНЕНИЕ после ЛЕВОГО НАРУЖНОГО СОЕДИНЕНИЯ - PullRequest
1 голос
/ 20 февраля 2020

У меня есть запрос ниже;

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, так и те, у которых есть.

Но производительность для последнего запроса слишком низкая.

Есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Что если вы переместите лог c в предложение 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)
0 голосов
/ 20 февраля 2020

Я думаю, что это то, что вы хотите:

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, что рассматривается как ложное.

...