LEFT JOIN концепция нулевых значений - PullRequest
0 голосов
/ 21 июня 2020

У меня есть таблицы products и product_translations. В таблице product_translations есть поля: id, product_id, locale, name.

Теперь я хочу выбрать такие продукты и переводы:

SELECT * FROM products AS P
LEFT JOIN product_trs Ptr on P.id = Ptr.product_id
WHERE locale = 'fr'

, но проблема в том, что если у продукта нет переводы (пока), эти продукты не возвращаются.

Например, скажем, мой product_translations имеет следующие строки:

id  pr_id locale    name
------------------------------
1    1    'en'    'product 1'
2    1    'fr'    'produit 1'
3    2    'en'    'product 2'

Теперь, если я выберу

WHERE locale = 'en'

I Я получу 2 строки. Если я запрошу запрос с:

WHERE locale = 'fr'

, я получу одну строку

Я хочу всегда получать 2 строки. Даже если у меня нет перевода. Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 21 июня 2020

Вам нужно переместить условие в предложении where в предложение on:

SELECT *
FROM products P LEFT JOIN
     product_trs Ptr 
     ON P.id = Ptr.product_id AND ptr.locale = 'fr';

В противном случае фильтрация происходит после left join - и Тогда locale будет NULL, что не дает сравнения.

Общее правило - фильтрация по первой таблице в left join go в предложении where. Фильтры во второй (и последующих) таблицах go в предложении on.

0 голосов
/ 21 июня 2020

когда вы пишете свой фильтр в «где», записи удаляются из результата, но если вы помещаете его в «условие соединения», записи просто фильтруются из таблицы, а не из результата, и возвращает ноль. так что ответ Гордона правильный.

SELECT *
FROM products P LEFT JOIN
 product_trs Ptr 
 ON P.id = Ptr.product_id AND ptr.locale = 'fr';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...