提问者:小点点

左联接空值概念


我有'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'

现在如果我选择with

WHERE locale = 'en'

如果使用以下命令运行查询,我将得到2行:

WHERE locale = 'fr'

我要一排

我想一直得到2行。 即使我没有翻译。 我怎么能那么做?


共1个答案

匿名用户

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

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

否则,过滤发生在左联接之后--然后区域设置,这将使比较失败。

一般规则是left join中第一个表的筛选器进入where子句。 第二个(及后续)表的筛选器位于on子句中。