我有'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行。 即使我没有翻译。 我怎么能那么做?
您需要将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
子句中。