LEFT JOIN 空值概念

LEFT JOIN null values concept

我有 'products' 和 'product_translations' table。 'product_translations' table 有: id、product_id、语言环境、名称字段。

现在我想select这样的产品和翻译:

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'

现在如果我 select 和

WHERE locale = 'en'

我会得到 2 行,如果我 运行 查询:

WHERE locale = 'fr'

我要一排

我想始终获得 2 行。即使我没有翻译。我该怎么做?

您需要将 where 子句中的条件移动到 on 子句中:

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

否则,过滤发生在 之后 left join -- 然后 localeNULL,比较失败。

一般规则是 left join 中第一个 table 的过滤器进入 where 子句。第二个(及后续)table 的过滤器进入 on 子句。

当您在“where”中编写过滤器时,记录会从结果中删除,但如果您将其置于“连接条件”中,记录只会从 table 而不是结果和 returns null 中过滤. 所以戈登的回答是正确的。

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